【问题标题】:dplyr::mutate:- new column = difference between two comma-delimited list columnsdplyr::mutate:- 新列 = 两个逗号分隔的列表列之间的差异
【发布时间】:2016-08-23 21:02:33
【问题描述】:

有效的例子:

df <- data.frame(c0=c(1, 2), c1=c("A,B,C", "D,E,F"), c2=c("B,C", "D,E"))
df
#   c0    c1  c2
# 1  1 A,B,C B,C
# 2  2 D,E,F D,E

# Add a column d with difference between c1 and c2
df %>% mutate(d=setdiff(unlist(strsplit(as.character(c1), ",")), unlist(strsplit(as.character(c2), ","))))

#   c0    c1  c2 d
# 1  1 A,B,C B,C A
# 2  2 D,E,F D,E F

我得到了我在上面所期望的:d 被分配了这两个字符列表之间的差异(它们已经排序)。

但是,如果我引入多个不同的角色,它将不再有效:

df <- data.frame(c0=c(1, 2), c1=c("A,B,C", "D,E,F,G"), c2=c("B,C", "D,E"))
df
#   c0      c1  c2
# 1  1   A,B,C B,C
# 2  2 D,E,F,G D,E

# Add a column d with difference between c1 and c2
df %>% mutate(d=setdiff(unlist(strsplit(as.character(c1), ",")), unlist(strsplit(as.character(c2), ","))))
Error: wrong result size (3), expected 2 or 1

我想达到的是:

  c0    c1    c2  d
1  1 A,B,C    B,C A
2  2 D,E,F,G  D,E F,G

我尝试在 setdiff 周围添加paste(),但这并没有帮助。最后,我实际上希望能够使用tidyr::separate 将 d 列拆分为新行,例如:

  c0    c1    c2  d
1  1 A,B,C    B,C A
2  2 D,E,F,G  D,E F
3  2 D,E,F,G  D,E G

上面的 setdiff 我做错了什么?

谢谢

提姆

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您收到错误是因为在第 2 行您有多个元素无法容纳一个单元格,一种方法是使用 rowwise 并将结果包装为列表以便它可以容纳,然后使用 unnesttidyr展开列表类型栏:

    library(dplyr)
    library(tidyr)
    df %>% 
          rowwise() %>% 
          mutate(d=list(setdiff(unlist(strsplit(as.character(c1), ",")), 
                                unlist(strsplit(as.character(c2), ","))))) %>% 
          unnest()
    
    # Source: local data frame [3 x 4]
    
    #      c0      c1     c2     d
    #   <dbl>  <fctr> <fctr> <chr>
    # 1     1   A,B,C    B,C     A
    # 2     2 D,E,F,G    D,E     F
    # 3     2 D,E,F,G    D,E     G
    

    【讨论】:

    • 我以前没有遇到过 rowwise 和 unnest。要检查我理解: rowwise 使后续的汇总和变异操作在每一行中工作(当我尝试按上面的方式粘贴时,它连接了所有行的值)。 unnest 做了我提议的tidyr::separate 的工作 - 为 d 中的每个列表元素重复行。我发现这篇文章对 unnest 很有用:bioinfoblog.it/2015/02/…。再次感谢@Psidom
    • 粘贴将失败,因为它是矢量化的,因此如果没有按行将操作限制为按行,则将列视为矢量; separate 旨在将一列拆分为多列,而 unnest 扩展一列,其中每个元素都是一个列表。
    • 注意在这里查看我的相关问题:stackoverflow.com/questions/39883000/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多