改变 ifelse 以替换 r 中的值
Mutate ifelse to replace values in r
我有一个如下所示的数据框:
Word Value1 Value2
Apple True True
Chair True False
nonWord False False
Hat False True
... ...
我正在尝试将 nonWords 的所有值更改为 NA
。
data %>%
mutate(Value1 = ifelse(Word == "nonWord", NA, Value1)) %>%
mutate(Value2 = ifelse(Word == "nonWord", NA, Value2))
但是,这似乎不起作用,因为我的值没有被 NA
的值替换。有谁知道我做错了什么?
期望的输出:
Word Value1 Value2
Apple True True
Chair True False
nonWord NA NA
Hat False True
... ...
为 i
(df1$Word == 'nonWord'
) 中的行创建一个逻辑向量,在 j
中指定列索引(-1
- 意味着不选择第一列)和将值分配给 NA
df1[df1$Word == 'nonWord', -1] <- NA
df1
# Word Value1 Value2
#1 Apple True True
#2 Chair True False
#3 nonWord <NA> <NA>
#4 Hat False True
或使用dplyr
library(dplyr) # 1.0.0
df1 <- df1 %>%
mutate(across(starts_with("Value"), ~ case_when(Word != 'nonWord' ~ .)))
在 OP 的 post 中,正在进行替换,但输出未分配 (<-
) 回原始对象。默认情况下,mutate
不会修改 in place
。如果我们想进行就地修改,请使用 magrittr
中的 %<>%
而不是 %>%
数据
df1 <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"),
Value1 = c("True", "True", "False", "False"), Value2 = c("True",
"False", "False", "True")), class = "data.frame", row.names = c(NA,
-4L))
在这些情况下,最好使用 base R
中的 replace()
而不是 ifelse()
:
library(dplyr)
df %>%
mutate(Value1 = replace(Value1, Word == "nonWord", NA),
Value2 = replace(Value2, Word == "nonWord", NA))
#> Word Value1 Value2
#> 1 Apple True True
#> 2 Chair True False
#> 3 nonWord <NA> <NA>
#> 4 Hat False True
如果您确定要替换的所有列都被命名为“值...”,您可以利用 dplyr
中的 mutate_at()
:
library(dplyr)
df %>%
mutate_at(vars(starts_with("Value")), ~ replace(., Word == "nonWord", NA))
#> Word Value1 Value2
#> 1 Apple True True
#> 2 Chair True False
#> 3 nonWord <NA> <NA>
#> 4 Hat False True
数据
df <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"),
Value1 = c("True", "True", "False", "False"), Value2 = c("True",
"False", "False", "True")), class = "data.frame",
row.names = c(NA, -4L))
我有一个如下所示的数据框:
Word Value1 Value2
Apple True True
Chair True False
nonWord False False
Hat False True
... ...
我正在尝试将 nonWords 的所有值更改为 NA
。
data %>%
mutate(Value1 = ifelse(Word == "nonWord", NA, Value1)) %>%
mutate(Value2 = ifelse(Word == "nonWord", NA, Value2))
但是,这似乎不起作用,因为我的值没有被 NA
的值替换。有谁知道我做错了什么?
期望的输出:
Word Value1 Value2
Apple True True
Chair True False
nonWord NA NA
Hat False True
... ...
为 i
(df1$Word == 'nonWord'
) 中的行创建一个逻辑向量,在 j
中指定列索引(-1
- 意味着不选择第一列)和将值分配给 NA
df1[df1$Word == 'nonWord', -1] <- NA
df1
# Word Value1 Value2
#1 Apple True True
#2 Chair True False
#3 nonWord <NA> <NA>
#4 Hat False True
或使用dplyr
library(dplyr) # 1.0.0
df1 <- df1 %>%
mutate(across(starts_with("Value"), ~ case_when(Word != 'nonWord' ~ .)))
在 OP 的 post 中,正在进行替换,但输出未分配 (<-
) 回原始对象。默认情况下,mutate
不会修改 in place
。如果我们想进行就地修改,请使用 magrittr
中的 %<>%
而不是 %>%
数据
df1 <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"),
Value1 = c("True", "True", "False", "False"), Value2 = c("True",
"False", "False", "True")), class = "data.frame", row.names = c(NA,
-4L))
在这些情况下,最好使用 base R
中的 replace()
而不是 ifelse()
:
library(dplyr)
df %>%
mutate(Value1 = replace(Value1, Word == "nonWord", NA),
Value2 = replace(Value2, Word == "nonWord", NA))
#> Word Value1 Value2
#> 1 Apple True True
#> 2 Chair True False
#> 3 nonWord <NA> <NA>
#> 4 Hat False True
如果您确定要替换的所有列都被命名为“值...”,您可以利用 dplyr
中的 mutate_at()
:
library(dplyr)
df %>%
mutate_at(vars(starts_with("Value")), ~ replace(., Word == "nonWord", NA))
#> Word Value1 Value2
#> 1 Apple True True
#> 2 Chair True False
#> 3 nonWord <NA> <NA>
#> 4 Hat False True
数据
df <- structure(list(Word = c("Apple", "Chair", "nonWord", "Hat"),
Value1 = c("True", "True", "False", "False"), Value2 = c("True",
"False", "False", "True")), class = "data.frame",
row.names = c(NA, -4L))