我想逐行搜索,如果它与预定义的向量匹配,请为该行的变量分配一个值。我更喜欢通过使用dplyr来解决问题。
举一个简单的例子:
a=c(1,2,NA)
b=c(1,NA,NA)
c=c(1,2,3)
d=c(1,2,NA)
D= data.frame(a,b,c,d)
我的尝试是:
D %>% mutate(
i= case_when(
identical(c(a,b,c),c(1,1,1)) ~ 1,
identical(c(a,b,c),c(NA,NA,3)) ~ 2
)
)
我希望它能给我:
a b c d i
1 1 1 1 1 1
2 2 NA 2 2 NA
3 NA NA 3 NA 2
但是我的代码不起作用,我猜是因为它没有将行与向量进行比较。
我不想在c==1 & b==1 & c== 1 ~ 1
时在case_when中简单键入内容,因为在数据集中键入的变量太多了。
谢谢您的建议。
答案 0 :(得分:2)
对于此示例
以下代码将起作用
a=c(1,2,NA)
b=c(1,NA,NA)
c=c(1,2,3)
D= data.frame(a,b,c,d)
D %>% mutate(
i= case_when(
paste(a,b,c, sep=',') == paste(1,1,1, sep=",") ~ 1,
paste(a,b,c, sep=',') == paste(NA,NA,3, sep=",") ~ 2
)
)
a b c d i
1 1 1 1 1 1
2 2 NA 2 2 NA
3 NA NA 3 NA 2
答案 1 :(得分:1)
如果我们有多个条件,请创建键/值数据集,然后进行联接
library(dplyr)
keydat <- data.frame(a =c(1, NA), b = c(1, NA), c = c(1, 3), i = c(1, 2))
left_join(D, keydat)
# a b c d i
#1 1 1 1 1 1
#2 2 NA 2 2 NA
#3 NA NA 3 NA 2