ID Pred1 Pred2 Pred3 Obs1 Obs2 Obs3 FP
1 Boston Tokyo London Boston London Other 0
2 Tokyo London Paris Seattle Paris Other 0
3 London Berlin Paris Paris Berlin London 0
4 Seattle Berlin London Tokyo Paris Boston 1
这是我的数据集。我要尝试做的是,如果在任何观察到的列(Obs1,Obs2,Obs3)中找到了来自预测列(“ Pred1”,“ Pred2”,“ Pred3”)的至少一个城市,则我给名为fp的列赋予0。 如果在观察到的列中没有找到预测列中的任何内容,则将1赋给fp列。 我正在尝试
mutate(fp = ifelse(c(pred1, pred2, pred3) %in% c(obs1, obs2, obs3),0,1)
等等,但是我没有得到我想要的...任何人都可以帮忙吗?
我想知道如何通过将mutate
函数和'%in%'
一起使用,或者如果不起作用,则使用任何其他方法来做到这一点。
答案 0 :(得分:2)
library(dplyr)
data %>%
group_by(ID) %>%
mutate(FP = ifelse(Pred1 %in% Obs1|Pred2 %in% Obs2|Pred3 %in% Obs3|
Pred1 %in% Obs2|Pred2 %in% Obs1|Pred3 %in% Obs2|
Pred1 %in% Obs3|Pred2 %in% Obs3|Pred3 %in% Obs1, "0", "1"))
如果数据仅限于这6列,这是最粗糙的方法
答案 1 :(得分:2)
所有答案都表明,有很多方法可以执行此操作,您可以使用c(pred1, pred2, pred3) %in% c(obs1, obs2, obs3)
的原始想法,但是您需要检查至少1个TRUE
,因此求和检查是否存在>0
TRUE,因此,
考虑到您对此的评论是rowwise
,我不会将任何内容分组
df %>%
rowwise %>%
mutate(FP = sum(c(Pred1, Pred2, Pred3) %in% c(Obs1, Obs2, Obs3)) > 0, # TRUE if at least 1 match
FP = as.numeric(!FP)) # This turns TRUE -> FALSE -> 0 as required
ID Pred1 Pred2 Pred3 Obs1 Obs2 Obs3 FP
<dbl> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 1 Boston Tokyo London Boston London Other 0
2 2 Tokyo London Paris Seattle Paris Other 0
3 3 London Berlin Paris Paris Berlin London 0
4 4 Seattle Berlin London Tokyo Paris Boston 1
答案 2 :(得分:1)
使用apply
的一种解决方案是按行检查"Pred"
列中是否有"Obs"
列中的值。
pred_cols <- grep("^Pred", names(df), value = TRUE)
obs_cols <- grep("^Obs", names(df), value = TRUE)
df$FP <- +(!apply(df, 1, function(x) any(x[pred_cols] %in% x[obs_cols])))
df
# ID Pred1 Pred2 Pred3 Obs1 Obs2 Obs3 FP
#1 1 Boston Tokyo London Boston London Other 0
#2 2 Tokyo London Paris Seattle Paris Other 0
#3 3 London Berlin Paris Paris Berlin London 0
#4 4 Seattle Berlin London Tokyo Paris Boston 1
使用tidyverse
/ gather
的{{1}}方法是
spread