R - 数据框中两组之间的差异

标签 r strsplit set-difference

我有 2 个因子列,我想创建第三个列,它告诉我第二个有哪些第一个没有。
跟这个很像post但我无法从 df 开始使用 setdiff()功能。
例如:

library(dplyr)
y1 <- c("a.b.","a.","b.c.d.")
y2 <- c("a.b.c.","a.b.","b.c.d.")
df <- data.frame(y1,y2)

栏目 y1a.b.和专栏y2a.b.c. .我想要三分之一的列返回 c.或只是 c .
> df
      y1     y2  col3
1   a.b.  a.b.c.  c.
2     a.    a.b.  b.
3 b.c.d.  b.c.d.  

我认为应该是strsplit的组合和 setdiff ,但我无法让它工作。

我试图转换 factor进入 character ,然后我尝试申请 strsplit()结果,但输出对我来说似乎很奇怪。好像在列表中创建了一个列表,导致很难传递给setdiff()
#convert factor to character
df <- df %>% mutate_if(is.factor, as.character)
lapply(df$y1,function(x)(strsplit(x,split = "[.]")))

> lapply(df$y1,function(x)(strsplit(x,split = "[.]")))
[[1]]
[[1]][[1]]
[1] "a" "b"


[[2]]
[[2]][[1]]
[1] "a"


[[3]]
[[3]][[1]]
[1] "b" "c" "d"

最佳答案

更新

当差异超过 1 个字符时出现问题,它创建了一个额外的行。为了克服这一点,我们 paste每个差异的所有元素一起。这也使我们免于 unlist步。

df$col3 <- mapply(function(x, y) paste0(setdiff(y, x), collapse = ""),
   strsplit(as.character(df$y1), "\\."), strsplit(as.character(df$y2), "\\."))

原答案

我们可以使用 mapply并在“。”上拆分两列使用 strsplit然后使用 setdiff 计算它们之间的差异.
df$col3 <- mapply(function(x, y) setdiff(y, x),
       strsplit(as.character(df$y1), "\\."), strsplit(as.character(df$y2), "\\."))

df
#     y1     y2 col3
#1   a.b. a.b.c.    c
#2     a.   a.b.    b
#3 b.c.d. b.c.d.     

如果我们不想要 col3作为列表,我们可以 unlist然而,其中一个问题是我们是否unlist它删除了 character(0)从中产生的值(value)。为了保留该值,我们需要对其进行额外检查。取自 here .
unlist(lapply(df$col3,function(x) if(identical(x,character(0))) ' ' else x))

#[1] "c" "b" " "

关于R - 数据框中两组之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889554/

相关文章:

r - 将逗号分隔的列条目拆分为行

r - ggplot : limit axis limits/breaks of individual facet

r - 当参数本身是随机变量时绘制正态分布

powershell - 可以在 PowerShell 中简化以下嵌套的 foreach 循环吗?

algorithm - 间隔和一组间隔之间的区别?

r - 线性插值时间序列中的缺失值

R:我必须在 String 中进行 Softmatch

r - 在 R 中,如何拆分向量中的每个字符串以返回第 N 个字符实例之前的所有内容?

Octave 将 strsplit 返回值向量化为单独的变量

java - 查找 Java 中字符串数组的差异