有类似措辞的问题,但不是我想要做的。
我有一个数据框,我想在其中删除具有 n 个连续 NA 值的行。
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 值,但我想连续调整它。
delete.na <- function(df, n=0) {
df[rowSums(is.na(df)) <= n,]
}
df <- delete.na(df,3)
因此,在这种情况下,在删除具有 3 个连续 NA 值的行后,我将拥有:
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
最佳答案
一个选项是遍历行,检查 rle
以返回相同的相邻元素的值和长度列表(这里是逻辑向量(is.na
- 即 TRUE - 对于 NA 和 FALSE 对于非 NA),因为“值”是合乎逻辑的,使用它来子集“长度”,检查它是否 all
小于 3并将其用作子集行的行索引
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
数据
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"))
关于R控制每行数据帧的连续NA值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61032169/