我很熟悉能够从R数据框(或矩阵)中提取列,如下所示:
df.2 <- df[, c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)
但是,可以使用一个!或其他工具来选择除列出的列之外的所有列吗?
对于背景,我有一个包含很多列向量的数据框,我想避免:
df.2 <- df[, c(1,3,5)]因为当我的.csv文件发生变化时,我的代码就变成了问题,因为编号不再相同了.我是R的新手,并且认为我已经学会了很难不使用数字向量来获得更大的df.我试过了:
df.2 <- df[, !c("name1", "name2", "name3")]
df.2 <- df[, !=c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)
正如我输入这个,发现这有效:
df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)
有没有比上一个更好的方法?
我试图在data.table中选择那些名称出现在我的角色向量中的列.该操作在纯data.frame中工作,但在data.table中不起作用.这是一个可重复的例子.
> names(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
[11] "carb"
> myVector <- c('disp', 'hp', 'wt')
> head(mtcars[, myVector])
disp hp wt
Mazda RX4 160 110 2.620
Mazda RX4 Wag 160 110 2.875
Datsun 710 108 93 2.320
Hornet 4 Drive 258 110 3.215
Hornet Sportabout 360 175 3.440
Valiant 225 105 3.460
Run Code Online (Sandbox Code Playgroud)
我刚刚制作了一个包含disp,, hp和的矢量,并且wt我使用该矢量在我的data.frame中选择了相应的列.现在让我们从data.frame中创建一个data.table对象,并尝试执行相同的操作.
> library(data.table)
> mtcarsDT <- data.table(mtcars)
> mtcarsDT[, myVector]
[1] "disp" "hp" "wt"
Run Code Online (Sandbox Code Playgroud) 我想打印数据表的所有列,dt除了其中一个已命名V3但不想按编号而是按名称引用它.这是我的代码:
dt = data.table(matrix(sample(c(0,1),5,rep=T),50,10))
dt[,-3,with=FALSE] # Is this the only way to not print column "V3"?
Run Code Online (Sandbox Code Playgroud)
使用这种data frame方式,可以通过代码执行此操作:
df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10))
df[,!(colnames(df)%in% c("X3"))]
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:是否有另一种方法不在数据表中打印一列而不必按编号引用它?我想找到类似于我上面使用的数据帧语法但使用数据表的东西.
以下代码确实有效,但我找不到任何关于帮助和插图中" .."(点点)运算符的文档data.table:
library(data.table)
cols <- c("mpg", "gear")
DT <- as.data.table(mtcars)
DT[ , ..cols]
Run Code Online (Sandbox Code Playgroud)
输出是:
mpg gear
1: 21.0 4
2: 21.0 4
3: 22.8 4
4: 21.4 3
5: 18.7 3
...
Run Code Online (Sandbox Code Playgroud)
为什么这样做,是否有任何文件?
PS:通常我会使用mget等...
编辑1:这不是保留名称的一个简单的ř特征...,..1,..2等等,这些都是用来指从主叫功能(参见向下传递的参数?Reserved).我的例子不使用数字,而是使用两个点后的字符.
编辑2:这不重复,因为Rich Scriven的示例显示:
> mtcars[, ..cols]
Error in `[.data.frame`(mtcars, , ..cols) : object '..cols' not found
Run Code Online (Sandbox Code Playgroud) 我使用以下习惯来有条件地从data.frame中选择列:
DF = data.frame(a = 1:3,b = letters[1:3],c = LETTERS[1:3])
someCondition <- FALSE
# use `if(someCondition)` to conditionally include column 'c'
DF[,c('a','b',if(someCondition)'c')]
:> a b
:> 1 1 a
:> 2 2 b
:> 3 3 c
Run Code Online (Sandbox Code Playgroud)
但是等价物不适用于data.table的b/c NULL值不会从列表中删除,就像它们从连接中删除一样:
DT = as.data.table(DF)
DT[,.(a,b,if(someCondition)c)]
:> Error in setnames(jval, jvnames) :
:> Can't assign 3 names to a 2 column data.table
Run Code Online (Sandbox Code Playgroud)
我已经定义了一个函数..,它是一个解决方法:
.. <- function(...){
x = list(...)
x= x[!sapply(x,is.null)]
x
}
DT[,..(a,b,if(someCondition)c)]
:> V1 V2
:> 1: 1 a …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据表
library(data.table)
DT <- data.table(x=c(1,1,0,0),y=c(0,1,2,3))
column_name <- "x"
x y
1: 1 0
2: 1 1
3: 0 2
4: 0 3
Run Code Online (Sandbox Code Playgroud)
我想访问 x = 1 的所有行,但使用 column_name。
所需的输出应如下所示:
DT[x==1,]
x y
1: 1 0
2: 1 1
Run Code Online (Sandbox Code Playgroud)
但在输入中x被替换为。column_name
请注意,此问题与Select subset of columns in data.table R类似但不完全相同,并且那里的解决方案(使用 with=FALSE)在这里不起作用。
这是我尝试过的所有事情。它们都不起作用。
DT[column_name ==1,]
DT[.column_name ==1,]
DT[.(column_name) ==1,]
DT[..column_name ==1,]
DT[."column_name" ==1,]
DT[,column_name ==1,]
DT[,column_name ==1,with=TRUE]
DT[,column_name ==1,with=FALSE]
DT[,.column_name ==1,with=TRUE]
DT[,.column_name ==1,with=FALSE]
DT[,..column_name ==1,with=TRUE]
DT[,..column_name ==1,with=FALSE]
DT[,."column_name" ==1,with=TRUE]
DT[,.column_name ==1,with=FALSE] …Run Code Online (Sandbox Code Playgroud)