连接列并将它们添加到数据框的开头

Cra*_*ple 4 r dataframe

Noob在这里向R.想要找出一些东西.我需要构建一个函数,在数据集的开头添加一个新列.此新列是用户指定的其他列中的值的串联.

想象一下,这是名为myDataSet的数据集:

col_1    col_2    col_3    col_4
bat      red      1        a
cow      orange   2        b
dog      green    3        c
Run Code Online (Sandbox Code Playgroud)

用户可以像这样使用这个功能:

addPrimaryKey(myDataSet, cols=c(1,3,4))
Run Code Online (Sandbox Code Playgroud)

获取新数据集的结果,将第1,3和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
Run Code Online (Sandbox Code Playgroud)

这是我一直在努力的剧本,但我一直盯着它,我想我犯了一些错误.我无法弄清楚如何正确地将参数中的列号输入到粘贴函数中.

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
}
Run Code Online (Sandbox Code Playgroud)

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

A5C*_*2T1 12

paste0工作得很好,有一些帮助do.call:

do.call(paste0, mydf[c(1, 3, 4)])
# [1] "bat1a" "cow2b" "dog3c"
Run Code Online (Sandbox Code Playgroud)

因此,您的功能可以是:

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

您可能还想看看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
Run Code Online (Sandbox Code Playgroud)