dplyr: сумма постоянного значения только для одного определенного уровня

#r #dplyr

#r #dplyr

Вопрос:

Я хотел бы применить сумму постоянного значения к переменной x во df фрейме данных. В моем примере:

 df = data.frame(a= sample(1:3,30,replace=TRUE),
                 b= sample(1:100,30,replace=TRUE),
                 x=rnorm(30))
  

Теперь мне нравится суммировать 0,05 с переменной x , только по уровню 3 в переменной a , затем я пытаюсь:

 
df2 <- df %>%
     mutate (x2=0.05   x[a==3])
Error: Problem with `mutate()` input `x2`.
x Input `x2` can't be recycled to size 30.
i Input `x2` is `0.05   x[a == 3]`.
i Input `x2` must be size 30 or 1, not 9.
Run `rlang::last_error()` to see where the error occurred.

  

Пожалуйста, есть идеи?

Ответ №1:

Если существует более одного значения, имеющего ‘a’ как 3, то возникает проблема с length . В примере показано,

 nrow(df)
#[1] 30
sum(df$a == 3)
#[1] 13
  

Есть разница в том, length mutate что выходной столбец (либо новый, либо тот же столбец) должен иметь ту же длину, что и исходный. С summarise (from dplyr >= 1.0.0) ограничение ослаблено, поскольку оно может возвращать количество строк, большее 1 (для каждой группы)

Если нам нужен sum только first элемент ‘x’, где ‘a’ равно 3, это можно сделать

 df %>%
  mutate(x2 = 0.05   first(x[a==3]))
  

Другой вариант — использовать логику для заполнения остальных строк тем же значением ‘x’

 df %>%
     mutate(x2 = replace(x, a == 3, 0.05   x[a==3]))
  

Или значение по умолчанию NA

 df %>%
   mutate(x2 = case_when(a == 3 ~  0.05   x))
  

Ответ №2:

Здесь могут быть некоторые обходные пути

 df %>%
  mutate(x2 = x   ifelse(a == 3, 0.05, 0))
  

или

 df %>%
  mutate(x2 = x   0.05*(a == 3))