gpt4 book ai didi

r - 如何按列删除具有 "NA"值的所有单元格

转载 作者:行者123 更新时间:2023-12-04 01:43:32 25 4
gpt4 key购买 nike

这个问题不是重复的,因为我的 data.frame 在所有列中没有相同数量的 NA 因此该问题中提到的解决方案不起作用。

我有一个带有很多 data.frame 值的 NA,我想删除所有具有 NA 值的单元格(重要的是:不是行或列,单元格)。原件看起来像这样:

A  B
1 NA
NA 2
2 NA
NA NA
NA NA
NA 4
3 5

所需的结果如下所示:
A  B
1 2
2 4
3 5

列数必须保持不变,但值是否保留在同一行上并不重要。它们可以向上移动。

我可以想象一个可以删除条件为 NA(可能带有应用)的所有单元格并获得结果。或者也许是一个简单的排序?

谢谢。

更新:
A   B   C
1 3
2
4 3

1 2

3 5
4
9
7 1

最佳答案

OP 已要求按列删除 NA s,但指出每列中可能有不同数量的 NA。
这可以使用 data.table 分两步解决:

library(data.table)
# step 1: coerce to data.table in place, move NAs to the bottom of each column,
# maintain the original order of non-NA values
result <- data.table(DF)[, lapply(.SD, function(x) x[order(is.na(x))])]
     A  B  C
1: 1 2 3
2: 4 1 3
3: 3 9 2
4: 7 NA 5
5: NA NA 4
6: NA NA 1
7: NA NA NA
8: NA NA NA
9: NA NA NA
10: NA NA NA
# step 2: trim result
# either using Reduce
result[!result[, Reduce(`&`, lapply(.SD, is.na))]]

# or using zoo::na.trim()
zoo::na.trim(result, is.na = "all")
    A  B C
1: 1 2 3
2: 4 1 3
3: 3 9 2
4: 7 NA 5
5: NA NA 4
6: NA NA 1

因此,在每个列的末尾不可避免地会有一些 NA ,因为 data.frame 中的所有列都具有相同的长度。
或者,也可以使用 is.nana.trim() 参数仅保留完整的行:
zoo::na.trim(result, is.na = "any")
   A B C
1: 1 2 3
2: 4 1 3
3: 3 9 2

替代解决方案
如前所述, data.frame s 和 cbind() 期望所有列向量具有相同的长度。这是一个没有 data.table 的替代解决方案,它使用 cbind.fill() 包中的 rowr 函数,用 fill 值填充向量直到相同的长度:
setNames(do.call(function(...) rowr::cbind.fill(..., fill = NA), lapply(DF, na.omit)),
colnames(DF))
   A  B C
1 1 2 3
2 4 1 3
3 3 9 2
4 7 NA 5
5 NA NA 4
6 NA NA 1

数据
正如 OP 在更新中提供的那样:
DF <- structure(list(A = c(1L, NA, 4L, NA, NA, NA, 3L, NA, NA, 7L), 
B = c(NA, 2L, NA, NA, 1L, NA, NA, NA, 9L, NA), C = c(3L,
NA, 3L, NA, 2L, NA, 5L, 4L, NA, 1L)), .Names = c("A", "B",
"C"), row.names = c(NA, -10L), class = "data.frame")

关于r - 如何按列删除具有 "NA"值的所有单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45376531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com