【问题标题】:Subset a dataframe using a string of column names使用一串列名对数据框进行子集化
【发布时间】:2016-01-13 19:58:53
【问题描述】:

我需要通过我创建的一串列名称对数据框 (df) 进行子集化 - 不知道如何将其注入子集..?

例如

colstoKeep is a character string:
"col1", "col2", "col3", "col4"

如何将其推入子集函数

df<- df[colstoKeep]

我确定这很容易。?因为上面的行不通。

【问题讨论】:

  • df[, c("A","B","X","T"] 即df = data.frame,方括号,逗号,A等为列名.
  • 是的,但我有 >1000 个 col 名称全部折叠成一个字符串,所以我想输入字符串名称,而不是在那里输入的物理列...
  • 那我就糊涂了。 colsToKeep 的确切值是多少? "col1", "col2", "col3", "col4" 不是有效的 R 对象。
  • 它是一个字符...一个长字符,id 喜欢将那个长字符对象放在子集函数中。
  • @user1945827 命令df[colstoKeep] 对数据帧有效。你不需要逗号。

标签: r


【解决方案1】:
df  <- data.frame(A=seq(1:5),B=seq(5:1),C=seq(1:5))
df

colsToKeep <- "\"A\", \"C\""

如果我正确理解您的问题,您的 colsToKeep 变量是上面给出的字符串。为了提取变量,您必须将其转换为向量。如果我使用了正确的格式,您可以使用以下代码来做到这一点。

library(magrittr)
colsToKeepVector <- 
  strsplit(colsToKeep, ",") %>%
  unlist() %>%
  trimws() %>%
  gsub("\"", "", .)

df[colsToKeepVector]

但是,如果我也了解您有一个向量并折叠为字符串 (paste(..., collapse = ", ")?),我强烈建议您不要这样做。

(已编辑以匹配问题中的字符串格式)

【讨论】:

    【解决方案2】:
    df  <- data.frame(A=seq(1:5),B=seq(5:1),C=seq(1:5))
    df
      A B C
    1 1 1 1
    2 2 2 2
    3 3 3 3
    4 4 4 4
    5 5 5 5
    
    cols_to_keep  <- c("A","C")
    df[,cols_to_keep]
      A C
    1 1 1
    2 2 2
    3 3 3
    4 4 4
    5 5 5
    

    【讨论】:

    • ColstoKeep 是由一个长的列名向量组成的,我用 \",\" 分隔以实现一个长的列名字符。然后,我需要使用该字符对 df 进行子集化,以仅在该 df 中保留那些可用的 Col。
    • 如果我将您的流程应用于我的示例,cols_to_keep 会返回“AC”,而不是“A”“C”吗?如果是这样,这就是它不起作用的原因。您需要将列名作为单独的实体。
    • colstokeep
    • 当我执行以下操作时, paste(colnames(df), collapse="\",\"") 我得到 "A\",\"B\",\"C" 是什么你的字符串的前十个字符是什么样的?你的 str(colstokeep) 是什么样子的?
    猜你喜欢
    • 2016-06-18
    • 2018-02-01
    • 1970-01-01
    • 2013-08-15
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多