【问题标题】:cbind a dynamic column name from a string in R从 R 中的字符串 cbind 动态列名
【发布时间】:2018-04-27 14:58:41
【问题描述】:

我想用从字符串动态分配的列名将列绑定到数据框

y_attribute = "Survived"
cbind(test_data, y_attribute = NA)

这会导致添加一个新列作为 y_attribute 而不是必需的 Survived 属性,该属性作为字符串提供给 y_attribute 变量。需要做什么才能使用变量提供的列名在数据框中获取列?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您实际上不需要cbind 来添加新列。其中任何一个都可以:

    test_data[, y_attribute] = NA # data frame row,column syntax
    test_data[y_attribute] = NA   # list syntax (would work for multiple columns at once)
    test_data[[y_attribute]] = NA # list single item syntax (single column only)
    

    在现有列之后添加新列,就像cbind

    【讨论】:

    • 其实代码就是绑定测试数据和训练数据。 rbind(train_data, cbind(test_data, y_attribute = NA))
    • 所以你不能轻易地将它嵌套在一行中,但这没问题。 test_data[, y_attribute] = NA; rbind(train_data, test_data).
    • 但是使用@akrun 的解决方案,我可以在一行中做到这一点rbind(train_data, mutate(.data = test_data,!! y_attribute := NA))
    • 你可以做类似rbind(train_data, {test_data[, y_attribute] = NA}) 的事情来强制它变成一行,但我不推荐它。
    • 我会说这是一个丑陋的黑客,而不是一个好的黑客。但是,如果您讨厌换行符并且不太关心代码的清晰度,那就去吧。
    【解决方案2】:

    我们可以使用tidyverse 来做到这一点

    library(dplyr)
    test_data %>%
         mutate(!! y_attribute := NA)
    #   col1 Survived
    #1    1       NA
    #2    2       NA
    #3    3       NA
    #4    4       NA
    #5    5       NA
    

    数据

    test_data <- data.frame(col1 = 1:5)
    

    【讨论】:

    • 这里为什么要加!!
    • @Rahul 用于评估从对象中获取值
    【解决方案3】:

    对此并不感到自豪,但我通常会这样做:

    dyn.col <- "XYZ"
    cbind(test.data, UNIQUE_NAMEXXX=NA)
    colnames(test.data)[colnames(test.data == 'UNIQUE_NAMEXXX')] <- dyn.col
    

    【讨论】:

    • 它很丑,但我喜欢它。
    【解决方案4】:

    我们也可以通过data.table来实现

    library(data.table)
    setDT(test_data)[, (y_attribute) := NA]
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2012-04-14
      • 2020-12-14
      • 1970-01-01
      • 2017-02-19
      • 2014-11-09
      • 1970-01-01
      相关资源
      最近更新 更多