dplyr :: mutate: - new column =两个以逗号分隔的列表列之间的差异

时间:2016-08-23 21:02:33

标签: r dplyr

有效的示例:

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我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

您收到错误,因为在第2行您有多个不适合单元格的元素,一种方法是使用rowwise并将结果包装为列表以便它可以适合并在此之后使用{来自unnest的{​​1}}展开列表类型列:

tidyr