这是我的数据集。
DTmtcars = as.data.table(mtcars); DTmtcars[, mtcarsname := rownames(mtcars)];
这些是用户输入,可能会有所不同, 至少有 1 个始终可用,可以按任意顺序, 这些用户输入只是告诉 data.table 的列名称
DTmtcars
.
这是这个问题的样本。
column1="mtcarsname";
column2="am";
column3="gear";
column4=NA;
要求显示数据集的这些列。
该代码是上述示例用户输入的理想解决方案。
DTmtcars[, .(w,x,y) , env = list(w=column1, x = column2,y =column3,z = column4)]
可能是 ifelse/fielse 或任何其他使该代码动态化的东西,以便为用户输入的所有可能组合生成输出。
输出应该是 data.table 而不是向量或 concat。 代码应该高效并且可以应用于非常大的数据集。 如果可以仅使用 data.table 包来完成,我将不胜感激。
看来你不希望 NA 列在这里出现,这是我的尝试
library(data.table)
DTmtcars = as.data.table(mtcars); DTmtcars[, mtcarsname := rownames(mtcars)];
column1="mtcarsname";
column2="am";
column3="gear";
column4=NA;
DTmtcars[,.SD, .SDcols = na.omit(c(column1,column2,column3,column4))]
这会导致
mtcarsname am gear
<char> <num> <num>
1: Mazda RX4 1 4
2: Mazda RX4 Wag 1 4
3: Datsun 710 1 4
4: Hornet 4 Drive 0 3
5: Hornet Sportabout 0 3
6: Valiant 0 3
7: Duster 360 0 3
8: Merc 240D 0 4
9: Merc 230 0 4
10: Merc 280 0 4
11: Merc 280C 0 4
....