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

时间:2014-02-10 16:22:08

标签: 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

用户可以使用如下功能:

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

获取新数据集的结果,将第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

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

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
}

非常感谢任何帮助。非常感谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这应该可以解决问题

addPrimaryKey <-function(df, cols){

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

   df<-cbind(q, df)

   return(df)

}

只需为空值添加一些条件逻辑

答案 2 :(得分:1)

用于合并列的其他两个选项是ngOnInitdplyr::mutate()

tidyr::unite()

library(dplyr) df %>% mutate(new_col = paste0(col1, col3, col4)) %>% select(new_col, everything()) # to order the column names with the new column first library(tidyr) df %>% unite(new_col, c(col1, col3, col4), sep = '', remove = FALSE) 中的默认参数为tidy::unite(),它从数据框中删除原始列,仅保留新列。