gpt4 book ai didi

r - dplyr::mutate:- 新列 = 两个逗号分隔列表列之间的差异

转载 作者:行者123 更新时间:2023-12-05 06:41:52 25 4
gpt4 key购买 nike

有效的例子:

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

谢谢

蒂姆

最佳答案

你得到错误是因为在第 2 行你有多个元素不能适合一个单元格,一种方法是使用 rowwise 并将结果包装为列表,以便它可以适合和之后使用 tidyr 中的 unnest 来扩展列表类型列:

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

关于r - dplyr::mutate:- 新列 = 两个逗号分隔列表列之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com