带有字符串向量

时间:2017-12-05 11:11:09

标签: r dataframe data.table

我想用一个条件来对数据表进行子集化,我希望将其应用于带有&的字符串向量中的所有列。介于两者之间。例如:

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") )

但我有点卡在这里。

3 个答案:

答案 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