R data.table:根据名称存储在其他位置的变量选择行
考虑以下几点:R data.table:根据名称存储在其他位置的变量选择行,r,data.table,R,Data.table,考虑以下几点: library(data.table) DataTableA <- data.table(v1 = c(1, 2, NA, 6, 3, NA), v2 = c(NA, 4, NA, NA, 1, 2), v3 = c(3, 3, NA, 4, 2, NA), v4 = c(2, NA, 3, NA, 3, NA),
library(data.table)
DataTableA <- data.table(v1 = c(1, 2, NA, 6, 3, NA),
v2 = c(NA, 4, NA, NA, 1, 2),
v3 = c(3, 3, NA, 4, 2, NA),
v4 = c(2, NA, 3, NA, 3, NA),
v5 = c(1, NA, NA, NA, 3, 4))
DataTableA
## v1 v2 v3 v4 v5
## 1: 1 NA 3 2 1
## 2: 2 4 3 NA NA
## 3: NA NA NA 3 NA
## 4: 6 NA 4 NA NA
## 5: 3 1 2 3 3
## 6: NA 2 NA NA 4
varnames <- c("v2", "v4", "v5")
但是我想避免写出变量名
有效的方法是
DataTableA[apply(!is.na(DataTableA[, ..varnames]), 1, any)]
但我想知道是否有更好的方法。如果没有,那当然没关系。如上所述使用apply
,我没有任何问题,但我对data.table的了解使我认为可能有一种更简单的方法
类似,但更复杂
感谢您提供的帮助。我们可以在
.SDcols
中指定“varnames”,在.SD
(Data.table的子集)上循环,应用函数并减少
DataTableA[DataTableA[, Reduce(`|`, lapply(.SD, is.na)), .SDcols = varnames]]
或使用
行和
DataTableA[DataTableA[, rowSums(!is.na(.SD)) > 0, .SDcols = varnames]]
谢谢你的回答。我不认为这些比我的问题中使用
apply
更简单,但作为一个新的data.table用户,我可以看到更多使用的示例。SD
行和
对于大数据来说要快得多。@IanCampbell谢谢,我没有考虑速度。@mark999是的,apply
更容易理解,但与列相比,R中的行循环效率更低。在第一个解决方案中,在列上循环并减少它。它应该比应用程序更快。此外,apply
将创建一个矩阵
,如果列不同,则在更改列类型的同时也会产生一些性能问题types@mark999. 另外,如果您只需要一个带apply的base R解决方案,那么转换为data.table
对我来说没有多大意义,因为在处理大数据集时,dat.atable的性能改进会更高
DataTableA[DataTableA[, rowSums(!is.na(.SD)) > 0, .SDcols = varnames]]