识别所有元素都缺少值的行-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):

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    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