R - 跨多个列应用条件忽略 NA

标签 r if-statement conditional-statements

假设我有以下数据框:

x <- c(1, 1, 2, 3, 4, 5)
y <- c(1, 1, 1, 3, 4, 5)
z <- c(NA, 1, 1, 3, 4, NA)

得到:

x  y  z
1  1  NA
1  1  1
2  1  1
3  3  3
4  4  4
5  4  NA

我想得到一个条件语句,如果所有的非 NA x、y 和 z 值都等于 1,那么它将被标记为 1,我将如何着手编写这个脚本?

比如我想要的是:

x  y  z  flag1
1  1  NA 1
1  1  1  1
2  1  1  0
3  3  3  0
4  4  4  0
5  4  NA 0

此外,我还想标记是否有任何变量包含 4,忽略 NA,这样我就可以得到:

x  y  z  flag1 flag2
1  1  NA 1     0
1  1  1  1     0
2  1  1  0     0
3  3  3  0     0
4  4  4  0     1
5  4  NA 0     1

最佳答案

最简单的是使用 rowSums

df$flag <-  +(!rowSums(df != 1, na.rm = TRUE) & !!rowSums(!is.na(df)))
df$flag2 <- +(rowSums(df == 4, na.rm = TRUE) > 0 & !!rowSums(!is.na(df)))

-输出

> df
  x y  z flag flag2
1 1 1 NA    1     0
2 1 1  1    1     0
3 2 1  1    0     0
4 3 3  3    0     0
5 4 4  4    0     1
6 5 4 NA    0     1

tidyverse 中,我们可以使用 if_allif_any 来创建这些列

library(dplyr)
df %>%
    mutate(flag1 = +(if_all(everything(),  ~is.na(.)| . %in% 1)), 
            flag2 = +(if_any(x:z, ~ . %in% 4)))
  x y  z flag1 flag2
1 1 1 NA     1     0
2 1 1  1     1     0
3 2 1  1     0     0
4 3 3  3     0     0
5 4 4  4     0     1
6 5 4 NA     0     1

数据

df <-structure(list(x = c(1, 1, 2, 3, 4, 5), y = c(1, 1, 1, 3, 4, 
4), z = c(NA, 1, 1, 3, 4, NA)), class = "data.frame", row.names = c(NA, 
-6L))

关于R - 跨多个列应用条件忽略 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69560076/

相关文章:

r - 将大列表转换为 data.frame

r - 将列类型转换为数值时更改值

java - while 循环中的三种 if - 情况之一似乎不起作用,而另外两种情况呢?

ruby-on-rails - 如何检查对象是否存在于 View ROR 中

java - 有条件地分配变量以匹配 xslt 模板中的路径

数组 : Need to Store Values Not Equal to Value at Index in C 的条件语句

r - 使用 R 计算字符串中的连续模式

r - R 中每个级别的信号/行之间的距离

javascript - 打印出数组中随机生成的数字后,在 2 个偶数之间添加破折号

css - 有条件地为 IE7/8 导入 CSS 文件