2014-02-10 56 views
3

Noob here to R.试图找出一些东西。我需要构建一个将新列添加到数据集开头的函数。这个新列是用户指定的其他列中值的并置。连接列并将它们添加到数据帧的开头

想象这是一个名为数据集myDataSet:

col_1 col_2 col_3 col_4 
bat  red  1  a 
cow  orange 2  b 
dog  green 3  c 

用户可以使用的功能,像这样:

addPrimaryKey(myDataSet, cols=c(1,3,4)) 

得到一个新的数据有3列1,设置的结果和4个连接成一列称为ID并添加到开头,如下所示:

ID  col_1 col_2 col_3 col_4 
bat1a  bat  red  1  a 
cow2b  cow  orange 2  b 
dog4c  dog  green 3  c 

T他是我一直在努力的剧本,但我一直在盯着它,我想我犯了一些错误。我无法弄清楚如何正确地将参数中的列号转换为粘贴功能。

addPrimaryKey <- function(df, cols=NULL){ 

    newVector = rep(NA, length(cols)) ##initialize vector to length of columns 

    colsN <- as.numeric(cols) 

    df <- cbind(ID=paste(
    for(i in 1:length(colsN)){ 
     holder <- df[colsN[i]] 
     holder 
    } 
    , sep=""), df) ##concatenate the selected columns and add as ID column to df 
df 
} 

任何帮助将不胜感激。非常感谢

回答

12

paste0工作正常,从do.call一些帮助:

do.call(paste0, mydf[c(1, 3, 4)]) 
# [1] "bat1a" "cow2b" "dog3c" 

你的功能,因此,可以是这样的:

addPrimaryKey <- function(inDF, cols) { 
    cbind(ID = do.call(paste0, inDF[cols]), 
     inDF) 
} 

您可能也想看看interaction

interaction(mydf[c(1, 3, 4)], drop=TRUE) 
# [1] bat.1.a cow.2.b dog.3.c 
# Levels: bat.1.a cow.2.b dog.3.c 
+0

这完美的作品,非常感谢。我正在看互联网上的do.call,但仍然无法理解它是如何在此贴上的。你能否解释为什么这会起作用? –

+1

@CrayonConstantinople,'mydf [c(1,3,4)]'实际上是一个有三个向量的列表,因为数据帧基本上是列表。 'do.call(paste0 ...)'相当于'paste0(mydf [,1],mydf [,3],mydf [,4])',其中列表中的每个值都成为'paste0'的参数。 – BrodieG

1

这应该做的伎俩

addPrimaryKey <-function(df, cols){ 

    q<-apply(df[,cols], 1, function(x) paste(x, collapse="")) 

    df<-cbind(q, df) 

    return(df) 

} 

在一些有条件的逻辑只需添加你的空

相关问题