识别所有元素都缺少值的行-R
我有这样一个缺少值的数据帧(df): df: 我想返回这样一个专栏(标题4) 即,如果行的所有元素都是一个缺失值(NA),则相关行将返回1,否则返回0。我如何使用R来实现这一点?我将非常高兴能得到任何帮助。非常感谢。你可以试试识别所有元素都缺少值的行-R,r,R,我有这样一个缺少值的数据帧(df): df: 我想返回这样一个专栏(标题4) 即,如果行的所有元素都是一个缺失值(NA),则相关行将返回1,否则返回0。我如何使用R来实现这一点?我将非常高兴能得到任何帮助。非常感谢。你可以试试 df$head4 <- +(rowSums(is.na(df))==ncol(df)) # head1 head2 head3 head4 #1 34 32 6 0 #2 NA NA NA 1 #3 45
df$head4 <- +(rowSums(is.na(df))==ncol(df))
# head1 head2 head3 head4
#1 34 32 6 0
#2 NA NA NA 1
#3 45 NA 11 0
#4 54 15 98 0
#5 45 56 NA 0
#6 3 1 78 0
#7 NA 5 NA 0
结果表明,@RichardTelford的说法是不正确的。这三种解决方案在速度上几乎没有任何差别,这意味着从程序员的角度来看,最简单的版本和更容易理解的版本应该更可取。您可以使用is.na()找到NAs,然后在rowMeans()的帮助下测试一行中的所有元素是否都是1
df$head4我建议使用Reduce
和lapply
组合,避免矩阵转换和一次性将整个对象复制到内存中
Reduce(`&`, lapply(df, is.na)) + 0L
# [1] 0 1 0 0 0 0 0
microbenckmark显示,这种解决方案的速度大约是其他两种方法的两倍。rowMeans解决方案比rowSums解决方案快约20%。
df$head4 <- +(rowSums(is.na(df))==ncol(df))
# head1 head2 head3 head4
#1 34 32 6 0
#2 NA NA NA 1
#3 45 NA 11 0
#4 54 15 98 0
#5 45 56 NA 0
#6 3 1 78 0
#7 NA 5 NA 0
m <- matrix(runif(1e6),ncol=4)
nas <- sample(1e6,0.3*1.e6)
m[nas] <- NA
df <- as.data.frame(m)
library(microbenchmark)
frowsums <- function(x) {+(rowSums(is.na(x))==ncol(x))}
flapply <- function(x) {Reduce(`&`, lapply(x, is.na)) + 0L}
frowmeans <- function(x) {1*(rowMeans(is.na(x)) == 1)}
res <- microbenchmark(
frowsums(df),
flapply(df),
frowmeans(df), times=1000L)
res
Unit: milliseconds
expr min lq mean median uq max neval cld
frowsums(df) 15.75257 16.63475 20.23377 17.14405 17.82396 80.63485 1000 b
flapply(df) 15.16721 15.23180 18.19778 16.13413 16.60948 88.92303 1000 a
frowmeans(df) 16.61643 17.56909 20.69433 18.03498 18.83867 81.54057 1000 b
df$head4 <- 1*(rowMeans(is.na(df)) == 1)
Reduce(`&`, lapply(df, is.na)) + 0L
# [1] 0 1 0 0 0 0 0