我想在4列中组合每一行的值,以获得单个唯一值,并在R中创建这些值的新列。例如,我有一个数据帧,如下所示:
Col_1 Col_2 Col_3 Col_4
1 23 45 12
0 45 17 4
0 667 60 5
64 123 299 5
87 23 60 6
现在我想要的新列col_5应该在它的所有行中包含一个唯一的值,表示这4个值……例如,第一行的是(1,23,45,12),这在我的数据框中是唯一的组合,但列中的单个值不是,因此我想在col_5中为所有行分配此组合的唯一值。请在R中建议一个函数。
此外,如果组合出现多次,则col_5中此类重复的值应该是相同的。
我尝试过使用DT[, lapply(.SD,sum), by=list(col_1,col_2,col_3,col_4)]
和DT[, Mean:=mean(col_4), by=list(col_1,col_2,col_3)]
,但它没有给我提供唯一的值。
发布于 2014-06-23 04:45:16
通过以下方式:
df$Col_5 <- paste(df$Col_1,df$Col_2,df$Col_3,df$Col_4,sep=",")
你会得到想要的结果。另一种替代方案(灵感来自@beginneR)是:
df$Col_5 <- do.call(paste, c(df, sep=","))
正如@beginneR所指出的,这不能是一个数字变量:
> class(df[,5])
[1] "character"
当你想要一个数值时,你也可以这样做:
df$Col_5 <- paste0(sprintf("%03s",df$Col_1),sprintf("%03s",df$Col_2),sprintf("%03s",df$Col_3),sprintf("%03s",df$Col_4))
当你想要它是数字的时候:
df$Col_5 <- as.numeric(paste0(sprintf("%03s",df$Col_1),sprintf("%03s",df$Col_2),sprintf("%03s",df$Col_3),sprintf("%03s",df$Col_4)))
发布于 2014-06-23 05:01:48
您可以使用interaction()
获取数值。这将创建一个因子,然后您可以将其转换为数字
dd$Col_5 <- as.numeric(interaction(dd[1:4], drop=T))
数字本身是任意的,但对于每种组合都是唯一的。
发布于 2014-06-23 16:07:47
如果dd
是数据集:
library(qdap)
transform(dd, Col_5=paste2(dd,sep=","))
或
colpaste2df(dd, list(Col_5=1:4),sep=",")
Col_1 Col_2 Col_3 Col_4 Col_5
1 1 23 45 12 1,23,45,12
2 0 45 17 4 0,45,17,4
3 0 667 60 5 0,667,60,5
4 64 123 299 5 64,123,299,5
5 87 23 60 6 87,23,60,6
https://stackoverflow.com/questions/24355480
复制相似问题