您如何查找在特定列中是否找到值?

时间:2019-04-23 23:14:35

标签: r filter tidyverse mutate

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%'一起使用,或者如果不起作用,则使用任何其他方法来做到这一点。

3 个答案:

答案 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