【发布时间】:2018-09-28 02:18:53
【问题描述】:
我有 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)
y1 列有a.b.,y2 列有a.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"
【问题讨论】:
-
df %>%rowwise()%>% mutate(col3 = gsub(y1,"",y2)) 怎么样。问题是如果 y1 有额外的字符 y2 没有它就不起作用。但只是一个可能更简单的解决方案的想法
-
实际上这会产生正确的结果。我实际上需要展示 y2 中没有的 y1 中的不同之处。我认为所有其他解决方案都做同样的事情。您可以将此作为解决方案而不是评论。
-
使用
df %>%rowwise()%>% mutate(col3 = gsub(y1,"",y2))的一个问题是,如果订单被更改,它将无法正常工作。考虑y1是否有a.b和y2是否有b.a.c。
标签: r strsplit set-difference