【问题标题】:Create an data.frame in R with dynamically assigned column names在 R 中使用动态分配的列名创建一个 data.frame
【发布时间】:2012-04-16 23:11:26
【问题描述】:

我需要创建一个 data.frame,它一次将由 for 循环的结果填充一行。它有 45 列:其中 5 列的名称是静态的,但其余的列是在运行时从外部 CSV 文件中读取的(作为向量)。我正在寻找类似的东西

goalsMenu <- read.csv("Phase 1 goalsmenu.csv", header = TRUE)
colHeads <- c("analysis","patient","date",as.vector(goalsMenu$Name),"CR")
output <- data.frame(colHeads)

但是,这会创建一个列名为 colHeads 的单列 data.frame。

colHeads <- list("analysis","patient","date",as.vector(goalsMenu$Name),"CR")

似乎朝着正确的方向迈出了一步,但我需要将其“展平”以创建所需的 data.frame 结构

你能建议吗?

【问题讨论】:

  • 每一列需要是什么类?

标签: r dataframe


【解决方案1】:
for (k in c(1:length(names_array))) {
   #Let's make a blank column, that's the length of the data frame that I'm 
   #going to attach it to:

   temp_col<-rep(NA, nrow(my_df))

   # now here's our 2nd loop
   for(i in c(1:nrow(my_df))) {
      #process the col with some stuff
       temp_col[i] <- i
    } 

    # now we're going to attach the column to the last column in the data 
    #frame
    my_df$temp_col<-temp_col

    # now we're going to assign the name from a vector 
    # we do this by looking at the length of the names
    # array, and use that as the index
    names(my_df)[length(names(my_df))]<-names_array[k]
}

【讨论】:

    【解决方案2】:

    这有帮助吗?

    goalsMenu <- paste("Name", 1:40, sep="")
    output <- as.data.frame(matrix(rep(0, 5 + length(goalsMenu)), nrow=1))
    names(output) <- c("analysis", "patient", "date", goalsMenu, "CR1", "CR2")
    

    基本上,我首先创建一个带有列数的 data.frame output,然后在下一步中命名这些列。但是,请注意 mdsumner 的评论!这样,所有列都属于numeric 类。不过,您可以稍后再处理:change the class of columns in data.frame

    【讨论】:

    • 谢谢 - 这已经奏效(尽管之后必须去掉第一个全零行)。除了日期之外(如您所料),所有列都是数字(前两个整数参考数字;其余均为浮点数)
    • @RobForsyth 既然您说无论如何都要遍历行以填充该 data.frame,我认为您只需从第一行开始并在那里替换零。此外,这应该会自动覆盖列类。那你的问题回答了吗?还是您在寻找其他东西?如果是前者,如果你能接受我或艾伦的回答会很好,所以这个不在名单上。否则,如果您能提供更多细节,我可以再试一次,那就太好了;-) 或者也许其他人有更好的解决方案(我想有一个)。
    • 对不起 - Stackoverflow 礼节的新手!现在标记为已回答:再次感谢!
    • 不用担心,我也花了一些时间来适应 SO。欢迎加入,很高兴我能帮上忙……
    【解决方案3】:

    如果你可以先用(一些)数据填充框架,那么你可以分配给 names()。否则,您必须先制作列表(然后再转换为 data.frame):

    col.names <- LETTERS[1:10]  # Example column names
    data <- vector("list", length(col.names))
    names(data) <- col.names
    print(str(data))            # Inspect the structure
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2021-08-21
      • 2020-10-29
      • 2020-09-25
      相关资源
      最近更新 更多