簡體   English   中英

改變 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取代。 有誰知道我做錯了什么?

所需的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM