【问题标题】:R - subset data frame column using names in vector list [duplicate]R - 使用向量列表中的名称子集数据框列[重复]
【发布时间】:2017-01-22 16:29:10
【问题描述】:

是否可以使用存储在列名数组中的列名来对数据框列进行子集化(到新的 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]]

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

谢谢

【问题讨论】:

  • 谢谢 - 第一个有效,但需要将数据框转换为表格...第二个在我尝试时无效:> cnm df[cnm ] [.data.table(df, cnm) 中的错误:当 i 是 data.table(或字符向量)时,x 必须是键控(即已排序,并且,标记为已排序),因此 data.table 知道要加入哪些列和利用 x 被排序。先调用 setkey(x,...),见 ?setkey。
  • 第二个不起作用,因为您的数据集是data.table

标签: r dataframe


【解决方案1】:

根据 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

根据?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

将子集数据集

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


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

df[[cnm]]

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

如果我们在data.table 中做data.frame subsetting 选项,它也不会起作用

df[cnm]

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

【讨论】:

  • 谢谢 - 我错过了 setDF(df) ...
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2021-10-04
  • 2018-12-21
  • 2019-04-06
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多