【问题标题】:R - Create concatenated column of row-wise unique values across columnsR - 创建跨列的逐行唯一值的连接列
【发布时间】:2016-08-14 00:27:43
【问题描述】:

我的数据如下所示:

df <- data.frame(id=1:8,
f1 = c("A","B","B","C","C","C","A","A"),
f2 = c("A",NA,"B",NA,"B","A","B","A"),
f3 = c("A",NA,NA,NA,NA,"A","C","C"))

我想要创建的是包含每行中存在的唯一值的列(不包括 NA)。所以结果将是列“f_values”:

  id f1   f2   f3 f_values
1  1  A    A    A        A
2  2  B <NA> <NA>        B
3  3  B    B <NA>        B
4  4  C <NA> <NA>        C
5  5  C    B <NA>       CB
6  6  C    A    A       CA
7  7  A    B    C      ABC
8  8  A    A    C       AC

row1 is A b/c 只有 A 出现。第 6 行是 CA,因为 C 和 A 出现唯一。我将该功能描述为逐行粘贴唯一。我知道将一些比较运算符和粘贴语句链接在一起是可能的,但是真实数据有更多的列,所以我希望有人知道更简单的方法。

【问题讨论】:

  • 请注意,问题中显示了两个不同的dfs

标签: r


【解决方案1】:

鉴于以上df

f_values<- sapply(apply(df[,-1],1, unique),function(x) paste(na.omit(x),collapse = ""))
df_new<-cbind(df,f_values)

df_new 将是您问题中提出的预期结果。

【讨论】:

  • 您可以在apply() 中完成所有操作,而不必使用两个循环。 apply(df[-1], 1, function(x) paste0(na.omit(unique(x)), collapse = ""))
  • 如果你想发表你的评论作为答案,我会选择它作为正确的。这绝对是最简单的方法。
【解决方案2】:

我们也可以在 data.table 中通过使用 'id' 进行分组。

library(data.table)
setDT(df)[, f_values := paste(na.omit(unique(unlist(.SD))), collapse="") , id]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多