我是R的初学者,在尝试做一些练习时,我陷入了其中一个。我的data.frame如下:
LanguageWorkedNow LanguageNextYear
Java; PHP Java; C++; SQL
C;C++;JavaScript; JavaScript; C; SQL
我需要知道LanguageNextYear
中的变量和LanguageWorkedNow
中的变量,以设置具有不同变量的列表。
很抱歉,如果问题重复,我在这里很陌生,试图找到它,但没有成功。
答案 0 :(得分:2)
想法:mapply
的{{1}} setdiff
在NextYear和WorkedNow上,然后使用strsplit
粘贴:
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=";"))
答案 1 :(得分:0)
以下是使用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
,因为我们有两个输入(您的两列),并且求取字符串/字符输出。