#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))