Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table:根据名称存储在其他位置的变量选择行_R_Data.table - Fatal编程技术网

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