R 基于另一列创建新的数据框列

R 基于另一列创建新的数据框列,r,R,我有一个包含两列的数据框,并希望创建第三列,它本质上是一个布尔值,用于判断第二列是否包含一组特定的值 f <- data.frame(name=c("John", "Sara", "David", "Chad"), car=c("Honda|Ford", "BMW", "Toyota|Chevy|Ford", "Toyota|Chevy|Ford|Honda")) 如果创建另一列,我现在要做的是,这将是一个布尔值,如果

我有一个包含两列的数据框,并希望创建第三列,它本质上是一个布尔值,用于判断第二列是否包含一组特定的值

f <- data.frame(name=c("John", "Sara", "David", "Chad"),
                 car=c("Honda|Ford", "BMW", "Toyota|Chevy|Ford", 
                 "Toyota|Chevy|Ford|Honda"))
如果创建另一列,我现在要做的是,这将是一个布尔值,如果make包含一个公共汽车,则为1,如果make包含一个非公共汽车,则为0

common = c("Honda", "Ford", "Toyota", "Chevy")
not_common = c("BMW", "Lexus", "Acura")
我尝试了一些方法,包括stringr包和ifelse,以生成以下输出

   name                     car                    make       common   
1  John              Honda|Ford              Honda Ford           1
2  Sara                     BMW                     BMW           0
3 David       Toyota|Chevy|Ford       Toyota Chevy Ford           1
4  Chad Toyota|Chevy|Ford|Honda Toyota Chevy Ford Honda           1
由于可以同时使用普通和不常见的汽车作为条目,因此不常见的汽车品牌应覆盖普通汽车品牌,并且该行的公共列中的值应为0。因此,如果一个条目同时包含BMW和福特,则该条目在公共列中应为0

有人能帮我完成这项任务吗

哦,这是我用stringr软件包尝试的,但它不起作用

common = c("Honda", "Ford", "Toyota", "Chevy")
not_common = c("BMW", "Lexus", "Acura")
common_match <- str_c(common)
not_match <- str_c(not_common)

main <- function(df) {
  f$new_make <- str_detect(f$make, common_match)
  df
}

main(f)
common=c(“本田”、“福特”、“丰田”、“雪佛兰”)
非通用=c(“宝马”、“雷克萨斯”、“讴歌”)

common_match不确定这是否是最有效的方法,但请尝试使用
grep
ifelse
应用于
f$car
的每个值。
|
字符仅表示组合
grep
中搜索词的
,与数据中的分隔符无关

f$common <- sapply(f$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1))

不确定这是否是最有效的方法,但尝试使用
grep
ifelse
应用于
f$car
的每个值。
|
字符仅表示组合
grep
中搜索词的
,与数据中的分隔符无关

f$common <- sapply(f$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1))

另一种方式和比较

f2 <- f[rep(1:4,50000),]
system.time({
v <- sapply(f2$make, strsplit, " ")
sapply(v, function(x) max(1-not_common %in% x)*max(common %in% x))
})
 user  system elapsed 
 7.94    0.01    8.00 

system.time(sapply(f2$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1)))
 user  system elapsed 
28.72    0.04   28.87 

f2另一种方法及比较

f2 <- f[rep(1:4,50000),]
system.time({
v <- sapply(f2$make, strsplit, " ")
sapply(v, function(x) max(1-not_common %in% x)*max(common %in% x))
})
 user  system elapsed 
 7.94    0.01    8.00 

system.time(sapply(f2$car,function(x) ifelse(length(grep("BMW|Lexus|Acura",x))>0,0,1)))
 user  system elapsed 
28.72    0.04   28.87 
f2