繁体   English   中英

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

[英]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 ,设置与不同的人的列表。

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

R基

想法: mapply setdiffstrsplit泰德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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM