R 如何在data.tables中使用i根据条件选择所有列的行

R 如何在data.tables中使用i根据条件选择所有列的行,r,dataframe,data.table,conditional-statements,R,Dataframe,Data.table,Conditional Statements,我有一个包含400多列的数据集,我试图找出哪些行的所有列都有NAs。在data.table框架中写出所有列的名称是不可行的,例如 data[is.na(colA) & is.na(colB) ... ] 是否有一种方法可以轻松地跨所有列执行此操作?这是一个玩具数据集,其中一行全部为NAs,另一行全部为1。返回包含所有NAs的行的最佳方式是什么?是否有类似的方法返回所有1s的行?谢谢 > toy <- data.table(cbind(A1 = c(1,5,6,NA,1),

我有一个包含400多列的数据集,我试图找出哪些行的所有列都有NAs。在data.table框架中写出所有列的名称是不可行的,例如

data[is.na(colA) & is.na(colB) ... ]
是否有一种方法可以轻松地跨所有列执行此操作?这是一个玩具数据集,其中一行全部为NAs,另一行全部为1。返回包含所有NAs的行的最佳方式是什么?是否有类似的方法返回所有1s的行?谢谢

> toy <- data.table(cbind(A1 = c(1,5,6,NA,1),
+                         B1 = c(1,NA,4,NA,0),
+                         C1 = c(1,1,6,NA,10),
+                         D1 = c(1,NA,4,NA,5),
+                         E1 = c(1,2,11,NA,8)))
> toy
   A1 B1 C1 D1 E1
1:  1  1  1  1  1
2:  5 NA  1 NA  2
3:  6  4  6  4 11
4: NA NA NA NA NA
5:  1  0 10  5  8
> # the goal
> toy[1]
   A1 B1 C1 D1 E1
1:  1  1  1  1  1
> toy[4]
   A1 B1 C1 D1 E1
1: NA NA NA NA NA
玩具 A1 B1 C1 D1 E1 1: 1 1 1 1 1 2:5Na1Na2 3: 6 4 6 4 11 4:NA-NA-NA-NA-NA 5: 1 0 10 5 8 >#目标 >玩具[1] A1 B1 C1 D1 E1 1: 1 1 1 1 1 >玩具[4] A1 B1 C1 D1 E1 1:NA-NA-NA-NA
文字实现:

toy[rowSums(sapply(toy,is.na))==ncol(toy),]
#A1 B1 C1 D1 E1
#1:NA-NA-NA-NA
玩具[行和(玩具==1)==ncol(玩具),]
#A1 B1 C1 D1 E1
# 1:  1  1  1  1  1
稍有改进,取消了对
ncol(toy)
的调用,尽管我怀疑相信这会提高速度是一厢情愿的想法:

toy[rowSums(sappy(toy,Negate(is.na))==0,]
toy[rowSums(toy!=1)==0,]

文字实现:

toy[rowSums(sapply(toy,is.na))==ncol(toy),]
#A1 B1 C1 D1 E1
#1:NA-NA-NA-NA
玩具[行和(玩具==1)==ncol(玩具),]
#A1 B1 C1 D1 E1
# 1:  1  1  1  1  1
稍有改进,取消了对
ncol(toy)
的调用,尽管我怀疑相信这会提高速度是一厢情愿的想法:

toy[rowSums(sappy(toy,Negate(is.na))==0,]
toy[rowSums(toy!=1)==0,]

这里有一个带有
Reduce的选项

library(data.table)
toy[toy[, Reduce(`&`, lapply(.SD, is.na))]]
#   A1 B1 C1 D1 E1
#1: NA NA NA NA NA

toy[toy[, Reduce(`&`, lapply(.SD, `==`, 1))]]
#    A1 B1 C1 D1 E1
# 1:  1  1  1  1  1

这里有一个带有
Reduce

library(data.table)
toy[toy[, Reduce(`&`, lapply(.SD, is.na))]]
#   A1 B1 C1 D1 E1
#1: NA NA NA NA NA

toy[toy[, Reduce(`&`, lapply(.SD, `==`, 1))]]
#    A1 B1 C1 D1 E1
# 1:  1  1  1  1  1

您可以尝试
toy[toy[,rowSums(is.na(.SD))==length(.SD)]
但不确定效率有多高。您可以尝试
toy[toy[,rowSums(is.na(.SD))==length(.SD)]
但不确定效率有多高。我经常忘记这些函数中的一些在总体上起作用,谢谢chinsoon12我经常忘记这些功能中的一些在整体上起作用,谢谢chinsoon12