处理条件列中的 NA
Deal with NAs in conditional column
我有一个数据框,比如df,想创建列来生成df2。
df <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
y = c(NA, 'N', 'Y', 'Y', 'N')))
df2 <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
y = c(NA, 'N', 'Y', 'Y', 'N'),
any = c('N', 'Y', 'Y', 'Y', 'N'),
both = c('N', 'N', 'N', 'Y', 'N')))
如果 x 和 y 中的一个或另一个或两者 == 'Y',则新列 'any' 应该 = 'Y'。如果 x 和 y == 'Y',则两者都应该 = 'Y'。
我还没有想出如何处理第一行中的 NA 来制作 any = 'Y.' 我当前的策略如下,但在第 1 行 'any' 列中给出了 NA,我想到 = 'Y'。即使存在 NA 值,我如何更改代码以给出 Y 的结果?
df2 <- df %>%
mutate(any = case_when(x =='Y'|y=='Y' ~'Y',
x != 'Y' & y != 'Y' ~ 'N'),
both = ifelse(x=='Y'& y=='Y', 'Y', 'N'))
您可以将基础 R 中的 any
和 all
函数与 na.rm = T
一起使用。它们都作用于向量,所以你需要在 mutate
之前添加 rowwise
这样你就把每一行的 x
和 y
值一起作为你的向量,而不是所有 x
个值和所有 y
个值。
library(tidyverse)
df %>%
rowwise() %>%
mutate(any = ifelse(any(x == "Y", y == "Y", na.rm = T), "Y", "N")) %>%
mutate(both = ifelse(all(x == "Y", y == "Y", na.rm = T), "Y", "N"))
#> Source: local data frame [5 x 4]
#> Groups: <by row>
#>
#> # A tibble: 5 x 4
#> x y any both
#> <chr> <chr> <chr> <chr>
#> 1 N <NA> N N
#> 2 Y N Y N
#> 3 N Y Y N
#> 4 Y Y Y Y
#> 5 N N N N
由 reprex package (v0.2.0) 创建于 2018-05-07。
您可以尝试 case_when
或 ifelse
。使用 %in%
而不是 ==
直接
处理 NA
的
df %>%
mutate(any=case_when(x %in% "Y" | y %in% "Y" ~ "Y", TRUE ~ "N"),
both=ifelse(x %in% "Y" & y %in% "Y", "Y", "N"))
x y any both
1 N <NA> N N
2 Y N Y N
3 N Y Y N
4 Y Y Y Y
5 N N N N
不需要rowwise
。
我有一个数据框,比如df,想创建列来生成df2。
df <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
y = c(NA, 'N', 'Y', 'Y', 'N')))
df2 <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
y = c(NA, 'N', 'Y', 'Y', 'N'),
any = c('N', 'Y', 'Y', 'Y', 'N'),
both = c('N', 'N', 'N', 'Y', 'N')))
如果 x 和 y 中的一个或另一个或两者 == 'Y',则新列 'any' 应该 = 'Y'。如果 x 和 y == 'Y',则两者都应该 = 'Y'。 我还没有想出如何处理第一行中的 NA 来制作 any = 'Y.' 我当前的策略如下,但在第 1 行 'any' 列中给出了 NA,我想到 = 'Y'。即使存在 NA 值,我如何更改代码以给出 Y 的结果?
df2 <- df %>%
mutate(any = case_when(x =='Y'|y=='Y' ~'Y',
x != 'Y' & y != 'Y' ~ 'N'),
both = ifelse(x=='Y'& y=='Y', 'Y', 'N'))
您可以将基础 R 中的 any
和 all
函数与 na.rm = T
一起使用。它们都作用于向量,所以你需要在 mutate
之前添加 rowwise
这样你就把每一行的 x
和 y
值一起作为你的向量,而不是所有 x
个值和所有 y
个值。
library(tidyverse)
df %>%
rowwise() %>%
mutate(any = ifelse(any(x == "Y", y == "Y", na.rm = T), "Y", "N")) %>%
mutate(both = ifelse(all(x == "Y", y == "Y", na.rm = T), "Y", "N"))
#> Source: local data frame [5 x 4]
#> Groups: <by row>
#>
#> # A tibble: 5 x 4
#> x y any both
#> <chr> <chr> <chr> <chr>
#> 1 N <NA> N N
#> 2 Y N Y N
#> 3 N Y Y N
#> 4 Y Y Y Y
#> 5 N N N N
由 reprex package (v0.2.0) 创建于 2018-05-07。
您可以尝试 case_when
或 ifelse
。使用 %in%
而不是 ==
直接
处理 NA
的
df %>%
mutate(any=case_when(x %in% "Y" | y %in% "Y" ~ "Y", TRUE ~ "N"),
both=ifelse(x %in% "Y" & y %in% "Y", "Y", "N"))
x y any both
1 N <NA> N N
2 Y N Y N
3 N Y Y N
4 Y Y Y Y
5 N N N N
不需要rowwise
。