Я работаю со следующим набором данных.
Name X Y
Mike 3.2 3.1
Joe 4.5 1.7
Eric 6.2 2.2
Stan NA 4.8
Я создаю новый столбец, который создает новый столбец, используя mutate
и case_when
. Значение в новом столбце — это средняя точка между X и y, если X больше 5, или 3/4 расстояния между X и Y, если X меньше или равно 5, или 20, если значение x равно нулю. . Я пробовал некоторый код в этом направлении, но мне не повезло.
df <- df %>%
mutate(NewCol = case_when(X >5 ~ (X+Y)/2,
X <= 5 ~ ((X+Y)*3)/4,
X = "NA" ~ 20)
Вот что я в конечном итоге хочу получить:
Name X Y NewCol
Mike 3.2 3.1 2.475
Joe 4.5 1.7 4.65
Eric 6.2 2.2 4.2
Stan NA 4.8 20
@ Ронак Шах не повезло с этим, просто получаю эту ошибку x Input `..2` must be a vector, not a `formula` object. ℹ Input `..2` is `is.na ...
Дело @rogues77 для is.na(X)
должно стоять на первом месте. Также работает TRUE ~ 20
в качестве последнего случая (вместо is.na(X)
).
Вы можете использовать is.na
для проверки значений NA
.
library(dplyr)
df %>%
mutate(NewCol = case_when(is.na(X) ~ 20,
X >5 ~ (X+Y)/2,
X <= 5 ~ ((X+Y)*3)/4))
# Name X Y NewCol
#1 Mike 3.2 3.1 4.725
#2 Joe 4.5 1.7 4.650
#3 Eric 6.2 2.2 4.200
#4 Stan NA 4.8 20.000
данные
df <- structure(list(Name = c("Mike", "Joe", "Eric", "Stan"), X = c(3.2,
4.5, 6.2, NA), Y = c(3.1, 1.7, 2.2, 4.8)),
class = "data.frame", row.names = c(NA, -4L))
можно ли вообще изменить это, чтобы это была формула, когда начальное значение равно NA? Я хотел бы изменить его так, что если X равно NA, то результирующее значение равно X+Y, умноженному на 2.
Да, вы можете заменить первую строку в case_when
на is.na(X) ~ (X+ Y) * 2,
, но в своем посте вы упомянули, что хотите, чтобы она была 20?
@rogues77 X
уже будет NA
, так почему именно вы хотите добавить NA
к Y
?
@Onyambu да, пожалуйста, не обращайте на это внимания, это один из самых тупых комментариев, которые я когда-либо писал
is.na(X) ~ 20