首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R子集dataframe - max值和NA

R子集dataframe - max值和NA
EN

Stack Overflow用户
提问于 2019-09-19 08:57:52
回答 2查看 64关注 0票数 0

我有以下测试数据

代码语言:javascript
复制
df <- data.frame(V1 = c(1, 2, 3), V2 = c(0, 5, NA), V3=c(NA, 10, NA), V4=c(2, 2, NA))    

> df

   V1 V2 V3 V4
 1  1  0 NA  2
 2  2  5 10  2
 3  3 NA NA NA       

现在,我想对这个数据进行子集:

  • 保留V2:V4的最大值小于3

的行

  • 保留V2:V4的所有值都为NA

的行

结果应该是这样的:

df_new

代码语言:javascript
复制
   V1 V2 V3 V4
 1  1  0 NA  2
 3  3 NA NA NA   

只保留原始数据的第一行和第三行。

我可以使用以下命令:

代码语言:javascript
复制
subset(DF, (is.na(V2) & is.na(V3) & is.na(V4)) | ((V2 < 3 | is.na(V2)) & (V3 < 3 | is.na(V3)) & (V4 < 3 | is.na(V4))))

做这件事。但这相当繁琐&在我的实际数据框架中,需要检查的列超过30列,因此必须有更好的方法来完成这一任务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-19 09:00:31

你可以:

代码语言:javascript
复制
df[rowSums(df[, 2:4] >= 3, na.rm = TRUE) == 0, ]

  V1 V2 V3 V4
1  1  0 NA  2
3  3 NA NA NA
票数 2
EN

Stack Overflow用户

发布于 2019-09-19 09:24:09

dplyr中,我们可以使用filter_at选择要检查的特定列,将replace NA值选择为0,并选择所有值都小于3的行。

代码语言:javascript
复制
library(dplyr)
df %>% filter_at(vars(V2:V4), all_vars(replace(., is.na(.), 0) < 3))

#  V1 V2 V3 V4
#1  1  0 NA  2
#2  3 NA NA NA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58007323

复制
相关文章

相似问题

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