r - 检查特定列中的所有行元素是否为 NA
问题描述
如果 my_var_a 到 my_var_c 都是 NA,我希望 my_var 为 0
# A tibble: 4 x 5
my_var my_var_a my_var_b my_var_c my_var_others
<int> <int> <int> <int> <int>
1 0 NA NA NA NA
2 1 NA 1 NA NA
3 0 NA NA NA NA
4 NA NA NA NA NA
我得到了我想要的结果:
library(tidyverse)
df %>% mutate(my_var = if_else(apply(select(., my_var_a:my_var_c), 1, function(x) all(is.na(x))), 0L, my_var))
有没有更简单的方法来做到这一点,或者至少有一种使用的方法purrr
?我调查了pmap
但无法弄清楚它将如何取代应用。
结果是:
my_var my_var_a my_var_b my_var_c my_var_others
<int> <int> <int> <int> <int>
1 0 NA NA NA NA
2 1 NA 1 NA NA
3 0 NA NA NA NA
4 0 NA NA NA NA
这是数据框:
structure(list(my_var = c(0L, 1L, 0L, NA), my_var_a = c(NA_integer_,
NA_integer_, NA_integer_, NA_integer_), my_var_b = c(NA, 1L,
NA, NA), my_var_c = c(NA_integer_, NA_integer_, NA_integer_,
NA_integer_), my_var_others = c(NA_integer_, NA_integer_, NA_integer_,
NA_integer_)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-4L))
解决方案
我们可以使用pmap_int
frompurrr
逐行迭代多个列。
library(dplyr)
library(purrr)
df %>% mutate(my_var = pmap_int(select(., my_var_a:my_var_c), ~any(!is.na(c(...)))))
# my_var my_var_a my_var_b my_var_c my_var_others
# <int> <int> <int> <int> <int>
#1 0 NA NA NA NA
#2 1 NA 1 NA NA
#3 0 NA NA NA NA
#4 0 NA NA NA NA
在基数 R 中,我们可以使用rowSums
并将 1 分配给至少有一个非 NA 值的行。
cols <- paste0("my_var_",letters[1:3])
df$my_var <- +(rowSums(is.na(df[cols])) < length(cols))
推荐阅读
- java - java - 如何在Java流中使用startsWith方法?
- java - OAuth2Client 每次都返回相同的令牌
- continuous-integration - 将 Gitlab CI 工件上传到 Gitlab 外部的存储中
- ruby-on-rails - 使用 grouped_options_for_select 设置默认值,使用 f.select
- java - 解释如何限制用户通过 Web 应用程序登录并仅在 Java 和 Spring 框架中允许通过移动应用程序登录?
- java - 在多个 EditText 字段中显示 Drawable
- sql - 匹配代码并复制列
- python - Tornado websocket 消息没有收到
- reactjs - 如果我从一个文件夹移动到另一个文件夹,使用 init 创建的 React Native 应用程序不起作用
- php - 使用jquery在for循环内延迟警报