R检查组中是否存在值

R检查组中是否存在值,r,data.table,R,Data.table,我有“数据”并希望创建“dataWANT”,如果“cat”或“fox”或“dog”中的任何字符串包含“a.b”或“c.e”或“e.W”,则在“WANT1”中包含得分值“1”;如果不是,“WANT1”等于零,如果所有的“猫”、“狐狸”和“狗”都是NA,那么“WANT1”等于“NA”。然后“WANT2”等于第一次出现的select值 需要一个data.table解决方案 dplyr/tidyr 图书馆弹琴 图书馆三年时间更长 想要% pivot_longercat:dog,name_to=pet,v

我有“数据”并希望创建“dataWANT”,如果“cat”或“fox”或“dog”中的任何字符串包含“a.b”或“c.e”或“e.W”,则在“WANT1”中包含得分值“1”;如果不是,“WANT1”等于零,如果所有的“猫”、“狐狸”和“狗”都是NA,那么“WANT1”等于“NA”。然后“WANT2”等于第一次出现的select值

需要一个data.table解决方案

dplyr/tidyr 图书馆弹琴 图书馆三年时间更长 想要% pivot_longercat:dog,name_to=pet,value_to=val%>% 组由学生ID%>% 总结 WANT2=0,val[1], WANT1=如果allis.NAVIA_integer_uuELSE+!是naWANT2吗 一个tibble:7x3 学生想要2 WANT1 1 c.e.1 2 a.b.1 3东西1 4 4 0 5 a.b.1 6 6 0 7 NA 通常,当没有公共项时,intersect将返回长度为0的向量。[1]强制执行某些操作,因为字符0[1]返回NA

数据表 图书馆数据表
dat我们可以在Data.table.SD的子集上使用Reduce和%in%循环创建“WANT1”列,检查元素是否是%in%的值向量,使用|将其减少为单个逻辑向量,并将所有“cat”、“fox”、“dog”在“WANT1”中都是NA的行更改为NA。对于WANT2,我们可以在替换除所需值以外的值后使用fcoalesce


顺便说一句:标记是特定于的,它在许多方面与R的base data.frame不同。我换了标签;如果我弄错了,我很抱歉。非常感谢。如果我需要修改它而不是c.e,例如它包含任何带有c.e的字符串,例如c.e5或c.e.q,该怎么办?非常感谢!只需更新wants变量,这就是它存在的原因:更新该变量并重新运行代码,所有这些都应该可以工作。您将其更改回,这是否意味着您正在寻找data.table解决方案?如果是,那么使用data.frame。。。功能是错误的/分散注意力。当你问到c.e和c.e5或c.e.q时,你是指模式吗?如果是这样的话,你需要清楚你的限制,因为这会很有趣。非常感谢是的,是一个data.table解决方案,因为有大数据集,但你的解决方案到目前为止仍然有效。我想对于'wants'变量,我想知道如何在不必列出它们的情况下包括所有包含c.e的度量?例如,每种类型可能超过50个,但核心是c.e
data=data.frame(    StudentID   =c( 1,2,3,4,5,6,7   ),
    cat =c( NA,'a.b','p','o','a.b','cb',NA    ),
    fox =c( 'c.e','qq',NA,'i','k','c.b',NA  ),
    dog =c( 'zz','u','e.W','h','g','f',NA   ))
library(reshape2)
data1 = melt(data, id.vars = "StudentID")

dataWANT=data.frame(    StudentID   =c( 1,2,3,4,5,6,7   ),
    WANT1   =c( 1,1,1,0,1,0,NA  ),
    WANT2   =c( 'c.e','a.b','e.W','NA','a.b','NA','NA'  ))
library(data.table)
setDT(data)[, WANT1 := +(Reduce(`|`, lapply(.SD, function(x)
       x %in% c('a.b', 'c.e', 'e.W')))), .SDcols = cat:dog]
data[is.na(cat) & is.na(fox)& is.na(dog), WANT1 := NA]
data[, WANT2 := do.call(fcoalesce, lapply(.SD,
       function(x) replace(x,  !x %in% c('a.b', 'c.e', 'e.W'), NA))), 
        .SDcols = cat:dog]
data[, .(StudentID, WANT1, WANT2)]
#   StudentID WANT1 WANT2
#1:         1     1   c.e
#2:         2     1   a.b
#3:         3     1   e.W
#4:         4     0  <NA>
#5:         5     1   a.b
#6:         6     0  <NA>
#7:         7    NA  <NA>