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
}
非常感谢任何帮助。非常感谢
答案 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)
用于合并列的其他两个选项是ngOnInit
和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()
,它从数据框中删除原始列,仅保留新列。