在R中选择数据表的所有其他列。两种语法之间有什么区别

时间:2019-06-05 20:23:17

标签: r data.table

让我们创建数据表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

1 个答案:

答案 0 :(得分:3)

最好将with = FALSEdata.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

因此,可能是更改行为的全局对象评估