[英]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
取代。 有誰知道我做錯了什么?
所需的 output:
Word Value1 Value2
Apple True True
Chair True False
nonWord NA NA
Hat False True
... ...
對於這些情況,最好使用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
如果您確定要替換的所有列都命名為“Value...”,您可以利用 dplyr 中的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))
為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 的帖子中,正在更換,但 output 未分配( <-
)回原始 object。 默認情況下, mutate
不會in place
修改。 如果我們想進行就地修改,請使用%<>%
from 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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.