【问题标题】:Set up column names in a new data frame based on variable根据变量在新数据框中设置列名
【发布时间】:2023-03-23 15:01:01
【问题描述】:

我的目标是能够将列名分配给我根据传递的变量创建的数据框。例如:

i='column1'

data.frame(i=1)
  i
1 1

当我希望它是“column1”时,列名上方是“i”。我知道以下工作,但效率不高:

i='column1'
df<-data.frame(x=1)
setnames(df,i)
  column1
1       1

【问题讨论】:

  • 这到底有多低效率?您在寻找什么类型的解决方案?
  • 我认为这里没有太大问题。您是否要在 R 脚本中保存行?
  • 通常我宁愿把这些都写在一起——例如在data.table上:a='column1'。要获得 column1 的总和:sum(dt[,eval(as.name(a))])

标签: r


【解决方案1】:

很高兴了解 base R 是如何工作的:

i  <- 'cloumn1'
df <- `names<-`(data.frame(1), i)
df
#  cloumn1
#1       1

【讨论】:

  • 这与df &lt;- setNames(data.frame(1), i) 相同,这是 OP 在一行而不是两行中的内容,尽管setNames() 似乎更具可读性。我仍然不明白这是如何“更有效率”的。
【解决方案2】:

除了其他用户发布的答案之外,我认为您可能会被您已经提出的解决方案所困扰。如果您已经有一个具有预期行数的数据框,则可以使用括号添加新列:

df <- data.frame('column1'=1)
i <- 'column2'
df[[i]] <- 2
df
column1 column2
1       2

【讨论】:

    【解决方案3】:

    如果你的想法是摆脱setNames,你可能永远不会这样做,但是

    i <- 'column1'
    data.frame(`attr<-`(list(1), "names", i))
    #   column1
    # 1       1
    

    你可以在data.frame看到,里面有代码

    x <- list(...)
    vnames <- names(x)
    

    所以,你可以弄乱 name 属性。

    【讨论】:

    • awwww 是的,按照最好的传统,用晦涩的 oneliners 替换易于阅读的 multiliners! +1!
    • @mathematical.coffee :D
    【解决方案4】:

    不完全确定您希望它如何更有效,但您可以在使用 colnames 组装数据框后一次添加所有列名。这是基于您的示例。

    data.frame(Td) a b 1 1 4 2 1 5

    nam<-c("Test1","Test2") colnames(Td)<-nam

    data.frame(Td) Test1 Test2 1 1 4 2 1 5

    【讨论】:

      【解决方案5】:

      您可以简单地将列变量的名称及其值作为参数传递给数据框,而无需添加更多行:

      df <- data.frame(column1=1)
      df
      #  column1
      #1       1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        相关资源
        最近更新 更多