【问题标题】:How do you find if a value is found in specific columns?如果在特定列中找到值,您如何查找?
【发布时间】:2019-09-13 04:37:27
【问题描述】:
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')中的任何城市,即至少一个城市,然后我将 0 分配给名为 fp 的列。 如果在观察列中没有发现预测列中的任何内容,那么我将 1 分配给 fp 列。 我正在尝试

mutate(fp = ifelse(c(pred1, pred2, pred3) %in% c(obs1, obs2, obs3),0,1)

等等,但我没有得到我想要的……有人可以帮忙吗? 我想知道如何通过专门使用 '%in%'mutate 函数或任何其他方法来做到这一点,如果这不起作用。

【问题讨论】:

  • 这是按行操作吗?
  • @Croote 是的!

标签: r filter tidyverse dplyr


【解决方案1】:
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 列,这是最粗略的方法

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      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
      

      使用gather/spreadtidyverse 方法将是

      library(tidyverse)
      
      df %>%
        gather(key, value, -ID) %>%
        group_by(ID) %>%
        mutate(FP = +(!any(value[key %in% pred_cols] %in% value[key %in% obs_cols]))) %>%
        spread(key, value)
      

      【讨论】:

      • 您好 Ronak,谢谢您的回答。 apply() 前面的加号,从第一个块开始,或者在 any() 前面 - 从第二个块开始,做什么?
      • @Molly 用于将逻辑 (TRUE/FALSE) 值转换为整数值 (1/0)。检查+c(TRUE, FALSE, TRUE)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2021-11-08
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多