让我们创建数据表data_1
。我想选择每隔一列,比方说奇数列。以下两种语法有什么区别?为什么第二个不起作用?
data_1 = data.table(col_1 = c(11, 21, 31),
col_2 = c(12, 22, 32),
col_3 = c(13, 23, 33),
col_4 = c(14, 24, 34))
col_dim <- ncol(data_1)
col_dim/2 # this equals 2
odd_cols <- data_1[, c(rep(c(TRUE, FALSE), 2))] # works
odd_cols
col_1 col_3
1: 11 13
2: 21 23
3: 31 33
odd_cols <- data_1[, c(rep(c(TRUE, FALSE), (col_dim/2)))] # does not work!
odd_cols
[1] TRUE FALSE TRUE FALSE
答案 0 :(得分:3)
最好将with = FALSE
与data.table
一起使用。它在两个数据集中给出相同的输出。根据{{1}}
with-默认情况下,== TRUE,并且j在x的框架内求值;列名称可用作变量。如果数据集内部和父范围中的变量名称重叠,则可以使用双点前缀..cols显式引用“ cols变量父范围,而不是从数据集中获取
?data.table
如果我们使用out1 <- data_1[, c(rep(c(TRUE, FALSE), (col_dim/2))), with = FALSE]
out2 <- data_1[, c(rep(c(TRUE, FALSE), 2)), with = FALSE]
identical(out1, out2)
#[1] TRUE
verbose = TRUE
在第一种情况下,它直接被视为data_1[, c(rep(c(TRUE, FALSE), (col_dim/2))), verbose = TRUE]
#Detected that j uses these columns: <none>
#[1] TRUE FALSE TRUE FALSE
索引
j
在第一种情况下,我们提供了一个数字/整数值,而在第二种情况下,它也在尝试在全局环境中查找对象(data_1[, c(rep(c(TRUE, FALSE), 2)), verbose = TRUE]
# col_1 col_3
#1: 11 13
#2: 21 23
#3: 31 33
)。为了了解行为,做了一些实验
1)提供'col_dim'的值,然后除以2
col_dim
2)排除类型
data_1[, c(rep(c(TRUE, FALSE), 4/2))]
# col_1 col_3
#1: 11 13
#2: 21 23
#3: 31 33
因此,可能是更改行为的全局对象评估