用分隔变量的两列之差;在R中

时间:2018-10-10 10:56:35

标签: r

我是R的初学者,在尝试做一些练习时,我陷入了其中一个。我的data.frame如下:

LanguageWorkedNow LanguageNextYear Java; PHP Java; C++; SQL C;C++;JavaScript; JavaScript; C; SQL

我需要知道LanguageNextYear中的变量和LanguageWorkedNow中的变量,以设置具有不同变量的列表。

很抱歉,如果问题重复,我在这里很陌生,试图找到它,但没有成功。

2 个答案:

答案 0 :(得分:2)

基本R

想法: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,因为我们有两个输入(您的两列),并且求取字符串/字符输出。