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

4

我是一名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个回答

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

这个完美地工作了,非常感谢。我正在网上查看 do.call,但仍然不明白它在这里与 paste 如何配合。你能否解释一下为什么这个有效? - Crayon Constantinople
1
@CrayonConstantinople,mydf[c(1, 3, 4)] 实际上是一个由三个向量组成的列表,因为数据框基本上就是列表。do.call(paste0...) 相当于 paste0(mydf[, 1], mydf[, 3], mydf[, 4]),其中列表中的每个值成为 paste0 的一个参数。 - BrodieG

1

合并列的另外两个选项是dplyr::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() 中的默认参数是 remove = TRUE,这会将原始列从数据框中删除,只保留新列。

1
这应该能起作用。
addPrimaryKey <-function(df, cols){

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

   df<-cbind(q, df)

   return(df)

}

只需为您的空值添加一些条件逻辑即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接