首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用rowwise()计算dataframe每行中NA的数量时出现问题

使用rowwise()计算dataframe每行中NA的数量时出现问题
EN

Stack Overflow用户
提问于 2021-04-19 00:27:06
回答 7查看 260关注 0票数 6

我在使用rowwise()计算每一行中的NAs数量时遇到了问题。我的最小示例:

代码语言:javascript
运行
复制
df <- data.frame(Q1 = c(rep(1, 1), rep(NA, 9)),
                 Q2 = c(rep(2, 2), rep(NA, 8)),
                 Q3 = c(rep(3, 3), rep(NA, 7))
)
df
   Q1 Q2 Q3
1   1  2  3
2  NA  2  3
3  NA NA  3
4  NA NA NA
5  NA NA NA
6  NA NA NA
7  NA NA NA
8  NA NA NA
9  NA NA NA
10 NA NA NA

我想创建一个新列来计算每行中的NAs数量。我可以非常简单地这样做:

代码语言:javascript
运行
复制
 df$Count_NA <- rowSums(is.na(df))
 df
   Q1 Q2 Q3 Count_NA
1   1  2  3        0
2  NA  2  3        1
3  NA NA  3        2
4  NA NA NA        3
5  NA NA NA        3
6  NA NA NA        3
7  NA NA NA        3
8  NA NA NA        3
9  NA NA NA        3
10 NA NA NA        3

但是如果我尝试使用row()通过dplyr来做这件事,我得到了错误的答案--列Count_NA在每一行中都有相同的数字:

代码语言:javascript
运行
复制
df %>%
   rowwise() %>%
   mutate(Count_NA = sum(is.na(.)))
# A tibble: 10 x 4
# Rowwise: 
      Q1    Q2    Q3 Count_NA
   <dbl> <dbl> <dbl>    <int>
 1     1     2     3       24
 2    NA     2     3       24
 3    NA    NA     3       24
 4    NA    NA    NA       24
 5    NA    NA    NA       24
 6    NA    NA    NA       24
 7    NA    NA    NA       24
 8    NA    NA    NA       24
 9    NA    NA    NA       24
10    NA    NA    NA       24

我做错了什么,我该如何解决这个问题?

非常感谢你提前

托马斯·菲利普斯

EN

回答 7

Stack Overflow用户

发布于 2021-04-19 00:34:44

使用cur_data()而不是点。.[cur_group_id(), ]c(Q1, Q2, Q3)across()c_across() (或根据其他答案带有参数的c_across )也可以。

请注意,最好在之后使用ungroup,否则它将保留行的内存,稍后可能会得到意想不到的结果。

代码语言:javascript
运行
复制
df %>%
   rowwise() %>%
   mutate(Count_NA = sum(is.na(cur_data()))) %>%
   ungroup

给予:

代码语言:javascript
运行
复制
# A tibble: 10 x 4
      Q1    Q2    Q3 Count_NA
   <dbl> <dbl> <dbl>    <int>
 1     1     2     3        0
 2    NA     2     3        1
 3    NA    NA     3        2
 4    NA    NA    NA        3
 5    NA    NA    NA        3
 6    NA    NA    NA        3
 7    NA    NA    NA        3
 8    NA    NA    NA        3
 9    NA    NA    NA        3
10    NA    NA    NA        3
票数 7
EN

Stack Overflow用户

发布于 2021-04-19 00:36:04

一个问题是,这里的.解析到整个框架,而不仅仅是整行。另一种dplyr方法,使用c_across

代码语言:javascript
运行
复制
df %>%
    rowwise() %>%
    mutate(a=sum(is.na(c_across(everything()))))
# # A tibble: 10 x 4
# # Rowwise: 
#       Q1    Q2    Q3     a
#    <dbl> <dbl> <dbl> <int>
#  1     1     2     3     0
#  2    NA     2     3     1
#  3    NA    NA     3     2
#  4    NA    NA    NA     3
#  5    NA    NA    NA     3
#  6    NA    NA    NA     3
#  7    NA    NA    NA     3
#  8    NA    NA    NA     3
#  9    NA    NA    NA     3
# 10    NA    NA    NA     3

我能看到使用这个和cur_data()之间的最大区别是c_across允许更直接地选择变量,就像在c_across(starts_with("Q"))中一样。诚然,一个人总是可以select(cur_data(),...),所以这是一个软弱的论点。

票数 5
EN

Stack Overflow用户

发布于 2021-04-19 00:52:29

baseR应答

代码语言:javascript
运行
复制
df$Count_NA <- apply(df, 1, function(x) sum(is.na(x)))                 

df
   Q1 Q2 Q3 Count_NA
1   1  2  3        0
2  NA  2  3        1
3  NA NA  3        2
4  NA NA NA        3
5  NA NA NA        3
6  NA NA NA        3
7  NA NA NA        3
8  NA NA NA        3
9  NA NA NA        3
10 NA NA NA        3

所以可以集成到dplyr管道中

代码语言:javascript
运行
复制
df %>% mutate(count_NA = apply(., 1, function(x) sum(is.na(x))))

   Q1 Q2 Q3 count_NA
1   1  2  3        0
2  NA  2  3        1
3  NA NA  3        2
4  NA NA NA        3
5  NA NA NA        3
6  NA NA NA        3
7  NA NA NA        3
8  NA NA NA        3
9  NA NA NA        3
10 NA NA NA        3
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67150864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档