我想组合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)]
但它并没有给我独特的价值。
答案 0 :(得分:3)
使用:
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)))
答案 1 :(得分:2)
您可以使用interaction()
获取数值。这将创建一个因子,然后您可以将其转换为数字
dd$Col_5 <- as.numeric(interaction(dd[1:4], drop=T))
数字本身是任意的,但对于每种组合都是唯一的。
答案 2 :(得分:2)
如果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
答案 3 :(得分:0)
在 dplyr 中,使用group_indices
:
group_indices(mtcars, gear, carb)
这类似于interaction()
,因为您不必担心两个字符串与paste()
是相同的,但是不需要任何因素。