gpt4 book ai didi

r - 如何仅在 R 中的两列中省略带有 NA 的行?

转载 作者:行者123 更新时间:2023-12-04 02:38:40 24 4
gpt4 key购买 nike

我想省略 NA 的行出现在两列中。

我熟悉 na.omit , is.na , 和 complete.cases ,但无法弄清楚如何使用这些来获得我想要的。例如,我有以下数据框:

(df <- structure(list(x = c(1L, 2L, NA, 3L, NA),
y = c(4L, 5L, NA, 6L, 7L),
z = c(8L, 9L, 10L, 11L, NA)),
.Names = c("x", "y", "z"),
class = "data.frame",
row.names = c(NA, -5L)))
x y z
1 4 8
2 5 9
NA NA 10
3 6 11
NA 7 NA

我想删除 只有那些行 NA出现在 xy列(不包括 z 中的任何内容),给出
x   y   z
1 4 8
2 5 9
3 6 11
NA 7 NA

有谁知道一个简单的方法来做到这一点?使用 na.omit , is.na , 或 complete.cases不管用。

最佳答案

df[!with(df,is.na(x)& is.na(y)),]
# x y z
#1 1 4 8
#2 2 5 9
#4 3 6 11
#5 NA 7 NA

我确实在一个稍大的数据集上进行了基准测试。结果如下:
set.seed(237)
df <- data.frame(x=sample(c(NA,1:20), 1e6, replace=T), y= sample(c(NA, 1:10), 1e6, replace=T), z= sample(c(NA, 5:15), 1e6,replace=T))

f1 <- function() df[!with(df,is.na(x)& is.na(y)),]
f2 <- function() df[rowSums(is.na(df[c("x", "y")])) != 2, ]
f3 <- function() df[ apply( df, 1, function(x) sum(is.na(x))>1 ), ]

library(microbenchmark)

microbenchmark(f1(), f2(), f3(), unit="relative")
Unit: relative
#expr min lq median uq max neval
# f1() 1.000000 1.000000 1.000000 1.000000 1.000000 100
# f2() 1.044812 1.068189 1.138323 1.129611 0.856396 100
# f3() 26.205272 25.848441 24.357665 21.799930 22.881378 100

关于r - 如何仅在 R 中的两列中省略带有 NA 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144675/

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