【问题标题】:in R, why does the column name change when creating a new row?在R中,为什么在创建新行时列名会发生变化?
【发布时间】:2021-02-24 00:48:10
【问题描述】:

我在下面有一个循环来创建新变量并使其成为新列。但是创建的列名是..有问题。我希望它是“cat1”、“cat2”、...“cat9”。但是,新列的名称是“cat1....a..1..”、“cat2....a..2..”、“cat3....a..3..”

这样定义列名是错误的方式吗? cat1

summary_cat_df <- data.frame()
id=1
idx=4
for (j in 1:length(cat_id_files)){ #44
  for (i in 1:length(cat_id_files[[j]])){ #10
    a <- summary_cat(cat_id_files[[j]][i], j, i)
    if(j %% 4 ==1){
      new_row <- data.frame(id=idx_list[[j]][i], type=name_list[[j]][i], iter=i, eye = "c", head="f", cat1 <- a[[1]], cat2 <- a[[2]], cat3 <- a[[3]], cat4 <- a[[4]], cat5 <- a[[5]], cat6 <- a[[6]], cat7 <- a[[7]], cat8 <- a[[8]], cat9 <- a[[9]])
     # column names are cat1....a..1..", "cat2....a..2.." not "cat1", "cat2",... "cat9".
    }
    summary_cat_df<- rbind(summary_cat_df, new_row)
  }
}
# the return value of summary_cat() is a dataframe
summary_cat <- function(df, j, i){
  cat_1 =0 
  cat_2 =0 
  cat_3 =0 
  cat_4 =0 
  cat_5 =0 
  cat_6 =0 
  cat_7 =0 
  cat_8 =0 
  cat_9 =0 
  cat_10 =0 
  cat_11 =0

  row_num <- nrow(get(cat_id_files[[j]][i]))
  row_num2 <- row_num -1
  for (k in 1: row_num2){
  
    temp_value <- get(cat_id_files[[j]][i])$slope_deviations_cat[[k]]
    #print(temp_value)
    
    if(temp_value == 1 ){
      cat_1 <- cat_1 + 1
    }else if(temp_value == 2 ){
      cat_2 <- cat_2 + 1
    }else if(temp_value == 3 ){
      cat_3 <- cat_3 + 1
    }else if(temp_value == 4 ){
      cat_4 <- cat_4 + 1
    }else if(temp_value == 5 ){
      cat_5 <- cat_5 + 1
    }else if(temp_value == 6 ){
      cat_6 <- cat_6 + 1
    }else if(temp_value == 7 ){
      cat_7 <- cat_7 + 1
    }else if(temp_value == 8 ){
      cat_8 <- cat_8 + 1
    }else if(temp_value == 9 ){
      cat_9 <- cat_9 + 1
    }else if(is.na(temp_value)){
      print("NA")
    }
  }
  result<-data.frame(cat_1 = cat_1,
                     cat_2 = cat_2,
                     cat_3 = cat_3,
                     cat_4 = cat_4,
                     cat_5 = cat_5,
                     cat_6 = cat_6,
                     cat_7 = cat_7,
                     cat_8 = cat_8,
                     cat_9 = cat_9)
  return(result)
}


> a <- summary_cat(cat_id_files[[1]][1], 1, 1)

> a
  cat_1 cat_2 cat_3 cat_4 cat_5 cat_6 cat_7 cat_8 cat_9

1    80     0    87     0     0     0    68     0   246

> a[1]
  cat_1
1    80

简单来说,我可以使用来解决这个问题

colnames(summary_cat_df)[6] <- "cat1"

不过,我想知道为什么列名这样定义,'cat1..a..1'?

任何改进代码的 cmets 都会很棒。我还在学习! 提前致谢。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您的代码看起来过于复杂,但要解决名称问题,您可以这样做:

    new_row <- data.frame(id=idx_list[[j]][i], type=name_list[[j]][i], iter=i, eye = "c", head="f")
    new_row <- cbind(new_row, a)
    

    我怀疑问题来自您使用&lt;- 而不是= 来定义new_row 中的cat

    【讨论】:

    • 我觉得我的代码也很乱。为什么我没有想到 cbind() !!!这是编写代码的一种更简单的方法,并且可以正常工作。非常感谢!另外,您的检查似乎是正确的。使用= 而不是&lt;-,定义了我想要的名称。我没有注意到我使用了&lt;- ...
    • 很高兴它有帮助。如果它解决了您的问题,请考虑接受答案:stackoverflow.com/help/someone-answers
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2018-07-31
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多