将4列中的值组合为单个唯一值

时间:2014-06-22 20:32:34

标签: r dataframe

我想组合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)]但它并没有给我独特的价值。

4 个答案:

答案 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()是相同的,但是不需要任何因素。