R

时间:2019-04-23 12:33:51

标签: r variables match

我要在汽车全名中添加新的汽车类型列。

从这样的汽车中许多制造商和汽车的全名。第一个单词是Campany名称,其次是或不正确的是汽车类型。

y = c("Volkswagan The Newbeatle", "Cadilac CTS", "Cadilac CTS-V",....)

我实际上有每个公司的汽车类型向量。这只是示例。

x = c("SLR", "Newbeatle", "300C", "CTS-V", "Spider", "CTS", ...)

目标是通过匹配汽车全名矢量来返回汽车类型。

result = c("Newbeatle", "CTS", "CTS-V", ...)

length(result)==length(y)
## TRUE

我已经得到了结果。但是教授要我不要使用“ for”和“ if”。

这是我的R代码(例如)。

library(tidyverse)

# This is cartype
x <- c("abc", "def", "xyz", "lmn")
# This is car full name
y <- c("abc xxx", "lmn xxx", "xxx xxx xxx", "xyz xxxx x x", "xxx xxx", "def xxx") 
# Split car name by blank(" ")
ys <- str_split(y, " ", simplify = T) 

# I want to new colume.
result <- NULL

for(i in 1:length(ys)){
  for(j in 1:length(x)){
    if(length(grep(x[j], ys[i]))>0){
      result[i]=x[j]
    }
  }
}

> result
[1] "abc" "lmn" NA    "xyz" NA    "def"

这是工作,但显示警告,教授不建议为此目的使用循环功能“ for”和“ if”。

1 个答案:

答案 0 :(得分:1)

像这样?

x <- c("abc", "def", "xyz", "lmn")
y <- c("abc xxx", "lmn xxx", "xxx xxx xxx", "xyz xxxx x x", "xxx xxx", "def xxx") 
ys <- str_split(y, " ", simplify = T) 
unlist(lapply(ys, function(l){x[l == x]}))