我想用一个条件来对数据表进行子集化,我希望将其应用于带有&的字符串向量中的所有列。介于两者之间。例如:
library(data.table)
test <- setDT(as.data.frame(list(ID = c(rep(1,10),rep(2,10)), time = rep(c(1:10),2),
Input = rep(c(array(data = 0, dim = 5),1,array(data = 0, dim = 4)),2),
replicate(4,sample(c(1:20), 10, replace = TRUE)))))
signalcolumns <- colnames(test)[! colnames(test) %in% c("ID","Input","time")]
现在我想要
test[X1 > 5 & X2 > 5 & X3 > 5 & X4 > 5]
我想用signalcolumns写它。
test[get(signalcolumns) > 5]
不起作用,因为它仅在第一个X1列上设置条件。我不知道我可以在这里使用什么语法。我试图评估像
这样的表达式c(paste0(signalcolumns[1:(length(signalcolumns)-1)],">5 &"),
paste0(signalcolumns[(length(signalcolumns)-1)],">5") )
但我有点卡在这里。
答案 0 :(得分:3)
在将.SDcols
指定为&#39; signalcolumns&#39;后,循环遍历data.table的子集,检查它是否大于5,然后Reduce
为单个{{ 1}}为每行的TRUE / FALSE以对行进行子集
vector
答案 1 :(得分:0)
我会做这样的事情:
testVars <- function(x, y){
X <- test[, x, with = F]
X <- X > y
X <- rowSums(X)
X == length(x)
}
test[testVars(signalcolumns, 5)]
# ID time Input X1 X2 X3 X4
# 1: 1 4 0 14 9 15 6
# 2: 1 5 0 14 12 20 16
# 3: 1 6 1 17 8 19 18
# 4: 1 10 0 6 17 8 14
# 5: 2 4 0 14 9 15 6
# 6: 2 5 0 14 12 20 16
# 7: 2 6 1 17 8 19 18
# 8: 2 10 0 6 17 8 14
答案 2 :(得分:0)
test[apply(test[, signalcolumns, with = FALSE] > 5, 1, all)]
# ID time Input X1 X2 X3 X4
# 1: 1 4 0 18 14 11 17
# 2: 1 8 0 15 20 15 14
# 3: 2 4 0 18 14 11 17
# 4: 2 8 0 15 20 15 14
以下是所遵循步骤的演练。
test
# ID time Input X1 X2 X3 X4
# 1: 1 1 0 11 5 12 3
# 2: 1 2 0 15 4 17 10
# 3: 1 3 0 3 16 10 19
# 4: 1 4 0 18 14 11 17
# 5: 1 5 0 10 18 7 3
# 6: 1 6 1 2 16 3 6
# 7: 1 7 0 2 4 5 5
# 8: 1 8 0 15 20 15 14
# 9: 1 9 0 16 20 11 5
# 10: 1 10 0 14 5 6 11
# 11: 2 1 0 11 5 12 3
# 12: 2 2 0 15 4 17 10
# 13: 2 3 0 3 16 10 19
# 14: 2 4 0 18 14 11 17
# 15: 2 5 0 10 18 7 3
# 16: 2 6 1 2 16 3 6
# 17: 2 7 0 2 4 5 5
# 18: 2 8 0 15 20 15 14
# 19: 2 9 0 16 20 11 5
# 20: 2 10 0 14 5 6 11
现在基于&gt;生成一个TRUE / FALSE值的表。 5
test_truth <- test[, signalcolumns, with = FALSE] > 5
test_truth
# X1 X2 X3 X4
# [1,] TRUE FALSE TRUE FALSE
# [2,] TRUE FALSE TRUE TRUE
# [3,] FALSE TRUE TRUE TRUE
# [4,] TRUE TRUE TRUE TRUE
# [5,] TRUE TRUE TRUE FALSE
# [6,] FALSE TRUE FALSE TRUE
# [7,] FALSE FALSE FALSE FALSE
# [8,] TRUE TRUE TRUE TRUE
# [9,] TRUE TRUE TRUE FALSE
# [10,] TRUE FALSE TRUE TRUE
# [11,] TRUE FALSE TRUE FALSE
# [12,] TRUE FALSE TRUE TRUE
# [13,] FALSE TRUE TRUE TRUE
# [14,] TRUE TRUE TRUE TRUE
# [15,] TRUE TRUE TRUE FALSE
# [16,] FALSE TRUE FALSE TRUE
# [17,] FALSE FALSE FALSE FALSE
# [18,] TRUE TRUE TRUE TRUE
# [19,] TRUE TRUE TRUE FALSE
# [20,] TRUE FALSE TRUE TRUE
然后,在每行上使用apply
。要应用的函数是all
,如果应用于它的所有值都为TRUE,则返回TRUE;如果任何值不为真,则返回FALSE。因此,对于所有值为TRUE的所有行,它将返回TRUE。
truth_vect <- apply(test_truth, 1, all)
truth_vect
# [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE
这是我们需要用来对表进行子集化的向量。
test[truth_vect]
# ID time Input X1 X2 X3 X4
# 1: 1 4 0 18 14 11 17
# 2: 1 8 0 15 20 15 14
# 3: 2 4 0 18 14 11 17
# 4: 2 8 0 15 20 15 14