首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R控制每行数据帧的连续NA值的数量

R控制每行数据帧的连续NA值的数量
EN

Stack Overflow用户
提问于 2020-04-05 01:39:29
回答 1查看 41关注 0票数 2

还有一些类似的问题,但并不完全是我想要做的。

我有一个数据框,我想要删除具有n个连续NA值的行。

代码语言:javascript
复制
1   Manhattan   NA      2300    NA      2275    2300    
2   Manhattan   2999    2975    NA      NA      2995    
3   Manhattan   NA      NA      NA      NA      4400    
4   Manhattan   6725    6500    6750    6995    6800    
5   Brooklyn    2000    1995    1975    2000    1999    
6   Bronx       1200    3200    NA      NA      NA

我有一些工作代码,删除n个总的NA值,但想要调整它的连续。

代码语言:javascript
复制
delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
df <- delete.na(df,3)

因此,在这种情况下,在删除具有3个连续NA值的行之后,我将具有:

代码语言:javascript
复制
1   Manhattan   NA      2300    NA      2275    2300    
2   Manhattan   2999    2975    NA      NA      2995    
4   Manhattan   6725    6500    6750    6995    6800    
5   Brooklyn    2000    1995    1975    2000    1999    
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 01:41:30

一种选择是循环各行,使用rle检查以返回相同的相邻元素的值和长度的列表(这里是逻辑向量(is.na -对于NA为TRUE,对于非NA为FALSE ),因为' values‘是逻辑的,所以使用它来对' lengths’进行子集,检查其all是否小于3,并将其用作行索引来子集行集

代码语言:javascript
复制
df[apply(df, 1, function(x) all(with(rle(is.na(x)), lengths[values]) <3)),]
#     city col1 col2 col3 col4 col5
#1 Manhattan   NA 2300   NA 2275 2300
#2 Manhattan 2999 2975   NA   NA 2995
#4 Manhattan 6725 6500 6750 6995 6800
#5  Brooklyn 2000 1995 1975 2000 1999

数据

代码语言:javascript
复制
df <- structure(list(city = c("Manhattan", "Manhattan", "Manhattan", 
"Manhattan", "Brooklyn", "Bronx"), col1 = c(NA, 2999L, NA, 6725L, 
2000L, 1200L), col2 = c(2300L, 2975L, NA, 6500L, 1995L, 3200L
), col3 = c(NA, NA, NA, 6750L, 1975L, NA), col4 = c(2275L, NA, 
NA, 6995L, 2000L, NA), col5 = c(2300L, 2995L, 4400L, 6800L, 1999L, 
NA)), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61032169

复制
相关文章

相似问题

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