R - 使用向量列表中的名称的子集数据框列

Zor*_*nic 5 r dataframe

是否可以使用存储在列名数组中的列名对数据框列进行子集化(到新的 df 中) - 就像 c("col1", "col9", "col6") 中那样?我知道我可以使用 df[[colname]] 语法引用 df 中的一列,但它不允许我对多列执行此操作:

df
   X1 X2 X3
1:  a  1  3
2:  b  5  3
3:  a  3  4
4:  c  6  5
5:  c  2  2

cnm<-c("X2","X3")

df[[cnm]]
Run Code Online (Sandbox Code Playgroud)

.subset2(x,i,exact =exact)中的错误:下标超出范围

谢谢

akr*_*run 7

基于OP的数据集,它看起来像一个data.table。为了对 data.table 中的列进行子集化,我们需要with = FALSE

df[, cnm, with = FALSE]
#   X2 X3
#1:  1  3
#2:  5  3
#3:  3  4
#4:  6  5
#5:  2  2
Run Code Online (Sandbox Code Playgroud)

根据?data.table文档

with - 默认情况下 with=TRUE 并且 j 在 x 的框架内求值;列名可以用作变量。

当 with=FALSE j 是列名称的字符向量、要选择的列位置的数值向量或 startcol:endcol 形式时,返回的值始终是 data.table。with=FALSE 在 data.table 中通常用于动态选择列。请注意,x[, cols, with=FALSE] 等效于 x[, .SD, .SDcols=cols]。

如果数据集是data.frame,则

setDF(df)#convert to 'data.frame'
df[cnm]
#   X2 X3
#1  1  3
#2  5  3
#3  3  4
#4  6  5
#5  2  2
Run Code Online (Sandbox Code Playgroud)

将对数据集进行子集化

用于提取或元素[[的单列data.framelist


在 a 中应用 OP 代码data.table会得到相同的错误消息

df[[cnm]]
Run Code Online (Sandbox Code Playgroud)

.subset2(x,i,exact =exact)中的错误:下标超出范围

如果我们在 中执行 data.frame 子集化选项data.table,它也将不起作用

df[cnm]
Run Code Online (Sandbox Code Playgroud)

(df, cnm)中的错误[.data.table:当 i 是 data.table (或字符向量)时,必须使用 'on=' 参数(参见 ?data.table)或通过键控 x (即排序,并且标记为已排序,请参阅 ?setkey)。由于 x 在 RAM 中排序,键控连接对于非常大的数据可能具有进一步的速度优势。