Как узнать, найдено ли значение в определенных столбцах? - PullRequest
2 голосов
/ 24 апреля 2019
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

Это мой набор данных.То, что я пытаюсь сделать, - это если какой-либо город, то есть хотя бы один город из прогнозируемых столбцов («Pred1», «Pred2», «Pred3»), найден в любом из наблюдаемых столбцов (Obs1, Obs2, Obs3), затемЯ даю 0 для столбца с именем fp.Если в наблюдаемом столбце ничего из предсказанного столбца не найдено, то я даю 1 столбцу fp.Я пытаюсь

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

и т.д., но я не получаю то, что я хочу ... кто-нибудь может помочь?Я хотел бы знать, как я могу сделать это, используя функцию mutate специально с '%in%' или любые другие методы, если это не работает.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019
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 голосов
/ 24 апреля 2019

Есть много способов сделать это, как было показано во всех ответах, вы можете использовать свою первоначальную идею c(pred1, pred2, pred3) %in% c(obs1, obs2, obs3), но вам нужно проверить по крайней мере 1 TRUE, следовательно, суммировать и проверять, есть ли >0 ИСТИНА возможна, следовательно, Принимая во внимание ваш комментарий для этого 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
1 голос
/ 24 апреля 2019

Одним из решений с 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 / spread будет

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...