基于列r更新名称

  • 本文关键字:更新 于列 r tidyverse
  • 更新时间 :
  • 英文 :


在这个问题(基于列更新名称)之后,我想问的另一件事

df <- data.frame(name1 = c("a", "a", "a", "a", 'a', NA, NA, NA,NA),
name2 = c("b", "b", "b", "b", "c", NA, NA, NA,NA),
name3 = c("b", "b", "b", "b", "c", "a", "a", "a", "f"))
df
name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     a
7  <NA>  <NA>     a
8  <NA>  <NA>     a
9  <NA>  <NA>     f

现在,我想保留f,而用b代替a

所期望的输出

name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     b
7  <NA>  <NA>     b
8  <NA>  <NA>     b
9  <NA>  <NA>     f

@Rui代码注释和@TarJae

df %>% 
mutate(name3 = case_when(
any(name1 == "a") & is.na(name2) ~ "b",
TRUE ~ name3
))

然而,在这种情况下,这不起作用,因为我从name2调用NA。有什么建议吗?

如果你只是想保持f,如何?

编辑除了ab将不会被改变。

df %>% 
mutate(name3 = case_when(
!(name3 %in% c("a", "b")) ~ name3,
any(name1 == "a") & is.na(name2) ~ "b",
TRUE ~ name3
))

name1 name2 name3
1     a     b     b
2     a     b     b
3     a     b     b
4     a     b     b
5     a     c     c
6  <NA>  <NA>     b
7  <NA>  <NA>     b
8  <NA>  <NA>     b
9  <NA>  <NA>     f

概括解决方案@Tjn25,可以执行以下操作

f <- function(x) ifelse(x == "a", "b", x)
data.frame(lapply(df, f))

如果您只想将names3列的值从a更改为b然后你可以使用

df$name3[df$name3 == 'a'] <- 'b'

最新更新