【问题标题】:Combine values in 4 columns to a single unique value将 4 列中的值合并为一个唯一值
【发布时间】:2014-06-22 20:32:33
【问题描述】:

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

【问题讨论】:

  • 您希望第 5 列的值为数字吗?如果是的话,它应该有一些基于 Col_1 等值的特定属性?
  • 是的,我希望该值是数字,并且该值应该是 4 列中值的某个函数。
  • 您可以使用df$Col_5 <- do.call(paste, df),它将第一行的结果为1 23 45 12。我怀疑是否有可能获得您描述的所需结果(用逗号分隔)作为numeric 类的列,因为这些条目不是正常数字。
  • @ShreedharPawar 我注意到在您提出的任何问题(目前为 14 个)中,您都没有接受答案。如果答案为您提供了所需的解决方案,则通常的做法是接受该答案(使用上/下投票按钮下方的复选标记按钮)。这将为未来的读者提供有关解决方案价值的线索。另请参阅此帮助页面:What should I do when someone answers my question? 如果您需要更多说明,您可以随时提出评论。

标签: r dataframe


【解决方案1】:

与:

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 很好,我想知道如何将sep="," 包含在do.call 中。现在我知道了
  • 感谢您提出一种获取数值的方法...我非常需要它来进一步处理我的数据...!
  • @SreedharPawar 不客气,你看到我的其他评论了吗?
  • 是的,我看到了,也感谢你提供了一条建议,但现在看不到我的评论。但我一定会记得为我得到的答案投票,而且我之前也为你投票过。
【解决方案2】:

您可以使用interaction() 获取数值。这将创建一个因子,然后您可以将其转换为数字

dd$Col_5 <- as.numeric(interaction(dd[1:4], drop=T))

数字本身是任意的,但对于每个组合都是唯一的。

【讨论】:

  • 谢谢你的回答,现在我也知道要得到一个数值了。
  • 如果组合重复,这是否会为组合提供相同的值...?
  • 只要你在所有相同的data.set中做,那么是的,重复的将得到相同的值。
【解决方案3】:

如果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

【讨论】:

    【解决方案4】:

    来自 dplyr,使用 group_indices

    group_indices(mtcars, gear, carb)
    

    这就像interaction(),因为您不必担心两个字符串与paste() 相同,但不需要因素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2014-06-27
      • 2019-11-12
      • 2012-01-15
      • 2013-03-26
      相关资源
      最近更新 更多