Как я могу сделать условный выбор, используя dplyr в R? - PullRequest
0 голосов
/ 21 сентября 2018

У меня следующая ситуация.Учитывая таблицу

df <- data.frame(ID = c(1, 2, 2, 3, 3, 4),
             type = c("MC", "MC", "MK", "MC", "MK", "MC"),
             value1 = c(512, 261, 4523, 1004, 1221, 2556),
             value2 = c(726, 4000, 280, 998, 113, 6789))

Я пытаюсь найти способ реализовать следующую логику: если для идентификатора встречаются оба типа (MC и MK), используйте value1 из MK и value2 из MC.В противном случае (встречается только тип MC), используйте MC.

Следовательно, конечный результат должен быть:

data.frame(ID = c(1, 2, 3, 4),
             type = c("MC", "MC", "MC", "MC"),
             value1 = c(512, 4523, 1221, 2556),
             value2 = c(726, 4000, 998, 6789))

Предполагается, что тип MK отбрасывается после извлечения значения 1.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Для эффективности я бы определенно предпочел ответ @Andre Elrico, но здесь есть вариант dplyr.Попробуйте:

df <- data.frame(ID = c(1, 2, 2, 3, 3, 4),
                 type = c("MC", "MC", "MK", "MC", "MK", "MC"),
                 value1 = c(512, 261, 4523, 1004, 1221, 2556),
                 value2 = c(726, 4000, 280, 998, 113, 6789)) 
library(dplyr)
df %>%
  reshape(., idvar = "ID", timevar = "type", direction = "wide") %>%
  group_by(ID) %>%
  mutate(value1 = ifelse(is.na(value1.MK), value1.MC, value1.MK),
         value2 = ifelse(is.na(value2.MC), value2.MK, value2.MC),
         type = "MC") %>%
  select(ID, type, value1, value2)
# output
# A tibble: 4 x 4
# Groups:   ID [4]
     ID  type value1 value2
  <dbl> <chr>  <dbl>  <dbl>
1     1    MC    512    726
2     2    MC   4523   4000
3     3    MC   1221    998
4     4    MC   2556   6789
0 голосов
/ 21 сентября 2018

Другая версия с dplyr

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(value1 = ifelse(any(type == "MK"), value1[type=="MK"],value1[type=="MC"]), 
         value2 = value2[type == "MC"]) %>%
  filter(type == "MC")

#     ID type  value1 value2
#  <dbl> <fct>  <dbl>  <dbl>
#1     1 MC       512    726
#2     2 MC      4523   4000
#3     3 MC      1221    998
#4     4 MC      2556   6789

Здесь, для value1 мы проверяем значение в «MK», если оно присутствует, или принимаем соответствующее значение «MC» вместо этого и для value2 по умолчаниюмы берем значение "MC" и сохраняем только строки с type "MC".Это предполагает, что каждая группа (ID) будет иметь строку "MC" type.

0 голосов
/ 21 сентября 2018

data.table решение

setDT(df1)[,{x=.SD;if(all(c("MC","MK") %in% type)){x$value1[] = last(value1)};first(x)},by=ID]

результат:

#  ID type value1 value2
#1  1   MC    512    726
#2  2   MC   4523   4000
#3  3   MC   1221    998
#4  4   MC   2556   6789

dplyr:

df1 %>% group_by(ID) %>% do(.,(function(x){if(all(c("MC","MK") %in% x$type)){x$value1[] = x$value1[x$type=="MK"]};x[1,]})(.))

# A tibble: 4 x 4
# Groups:   ID [4]
#     ID type  value1 value2
#  <dbl> <fct>  <dbl>  <dbl>
#1     1 MC       512    726
#2     2 MC      4523   4000
#3     3 MC      1221    998
#4     4 MC      2556   6789
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...