[英]Difference between two columns with separated variables by ; in R
我是R的初学者,在尝试进行一些练习时,我陷入了其中一个练习中。 我的data.frame如下:
LanguageWorkedNow LanguageNextYear Java; PHP Java; C++; SQL C;C++;JavaScript; JavaScript; C; SQL
我需要知道哪些是变量LanguageNextYear
而不是LanguageWorkedNow
,设置与不同的人的列表。
抱歉,如果问题重复,我在这里很陌生,试图找到它,但没有成功。
想法: mapply
setdiff
上strsplit
泰德NextYear和WorkedNow,然后粘贴使用它collapse=";"
:
df$New <- with(df, {
a <- mapply(setdiff, strsplit(NextYear, ";"), strsplit(WorkedNow, ";"), SIMPLIFY = FALSE)
sapply(a, paste, collapse=";")
})
# SIMPLIFY = FALSE is needed in a general case, it doesn't
# affect the output in the example case
# Or if you use Map instead of mapply, that is the default, so
# it could also be...
df$New <- with(df,
sapply(Map(setdiff, strsplit(NextYear, ";"), strsplit(WorkedNow, ";")),
paste, collapse=";"))
df <- read.table(text = "WorkedNow NextYear
Java;PHP Java;C++;SQL
C;C++;JavaScript JavaScript;C;SQL
", header=TRUE, stringsAsFactors=FALSE)
这是使用purrr
软件包的解决方案:
df = read.table(text = "
LanguageWorkedNow LanguageNextYear
Java;PHP Java;C++;SQL
C;C++;JavaScript JavaScript;C;SQL
", header=T, stringsAsFactors=F)
library(purrr)
df$New = map2_chr(df$LanguageWorkedNow,
df$LanguageNextYear,
~{x1 = unlist(strsplit(.x, split=";"))
x2 = unlist(strsplit(.y, split=";"))
paste0(x2[!x2%in%x1], collapse = ";")})
df
# LanguageWorkedNow LanguageNextYear New
# 1 Java;PHP Java;C++;SQL C++;SQL
# 2 C;C++;JavaScript JavaScript;C;SQL SQL
对于每一行,您都有自己的列,并且创建了值的向量(用;
分隔)。 然后,你检查它的值NextYear
不存在矢量WorkedNow
载体,创建基于/串结合这些值。
map
函数系列将帮助您将逻辑/函数应用于每一行。 在我们的例子中,我们使用map2_chr
因为我们有两个输入(您的两列),并且求取字符串/字符输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.