【问题标题】:create a variable and add to a data frame within a loop in R在 R 的循环中创建一个变量并添加到数据框中
【发布时间】:2018-11-25 07:08:49
【问题描述】:

R 的新手,我正在尝试在“for”循环中重命名/创建一个变量,将计数器“i”分配给它的名称,并将其保存到数据框中。我找不到将计数器分配给名称的方法:

 df.final <- NULL
 for(i in 1:n) {
  print(i)
  v1[i] <- df$v1 ############## I need help with this
  df$v1[i] <- v1[i] ############## and this
  if(i==1){
     df.final <- df
  } else {
     df.final <- merge(df.final, df, by = "ID")
  }
 }

我发现了以下内容:

 tmpvar <- paste("v1", i, sep= "")
 assign(tmpvar, df$v1)

这有助于创建特定于循环的变量(第一部分),但是如何将该变量添加到数据框(第二部分)?

我将不胜感激。

谢谢, 阿米尔

【问题讨论】:

  • 如果您发布您开始的内容会有所帮助。 df 中有什么内容?也许您可以向我们展示您想要的流程的两个步骤?
  • @vaettchen:对不起,不清楚。假设 df 是一个包含 ID 和 v1 的横截面数据集。为了让我的问题更有意义,我不得不提到的是,我在每次迭代中都在读取一个数据集,并将其 v1 保存到一个名为“df.final”的新数据集中。通过运行这个循环,我想获得一个新的数据集“df.final”,其中包含:ID v1_1 v1_2 ... v1_n。希望这更清楚。谢谢,

标签: r loops for-loop


【解决方案1】:

欢迎来到 R 社区!如果您可以通过示例代码(输入、所需输出)进一步澄清您的问题,这将有所帮助。我假设,您正在尝试在每个循环中创建一个新变量?也许以下有帮助:

假设我们将进行 3 次迭代。我将创建一个包含 2 列的简单示例数据集

n <- 3
# create an example dataframe with 2 columns
df<- as.data.frame(rbind(c(1,1),c(2,2),c(1,2)))
colnames(df)<- c("v1","ID")

接下来,创建一个空的 data.frame。在您的最后一步中,如果 df.final 没有具有该名称的列,则您不能通过列 ID 加入!

`df.final <- data.frame(matrix(ncol = 2, nrow = 0))
colnames(df.final)<- c("v1","ID")

让我们执行 for 循环

for(i in 1:n) {
  df[paste(colnames(df[1]),toString(i),sep ="_")] <- df[1] 
  if(i==n){
    df.final <- df
  } else {
    df.final <- merge(df.final, df, by = "ID") #there is no point of doing the join in my example!
  }
}

由于我不确定您到底想做什么,所以我编写了一些代码,复制第 1 列的内容并将其写入与第 1 列同名的列中加上后缀 I。所以让我们看声明:

colnames(df[1]) 以字符串 (var1) 的形式返回数据框第一列的名称 toString(i) 将您的迭代器 i 转换为字符串 通过使用带有sep ="_" 的 baste 函数,您可以将第一列的名称和迭代器组合成一个字符串。

df["varname"] 

是一种引用数据框中列的方法。

您的输出将如下所示

  v1 ID v1_1 v1_2 v1_3
1  1  1    1    1    1
2  2  2    2    2    2
3  1  2    1    1    1

希望有帮助!

【讨论】:

    【解决方案2】:

    我想这些代码会帮助你。另一种技巧:当您创建中间数据框时,您使用变量名重命名等于创建列的列名。

    for (i in 1:3){
      col_name <- paste0('add',i) 
      df_temp <- data.frame(add=runif(5))  #the new column you want to add
      colnames(df_temp) <- col_name       #change the column name 
      if (i==1){
        df_final <- df_temp
      }else{
        df_final <- cbind(df_final,df_temp)
      }
    }
    
    df_final
            add1      add2      add3
    1 0.02338753 0.7503266 0.4517581
    2 0.94139957 0.6460098 0.6369646
    3 0.81601567 0.1825294 0.1289575
    4 0.61678986 0.6715657 0.3979930
    5 0.11424770 0.7712202 0.9129960
    

    【讨论】:

      【解决方案3】:

      谢谢你们!对我很有帮助和教育意义。

      根据您的回答,我正在完善我的问题:

       n <- 5
      
       df.final <- NULL
      
       for(i in 1:n) {
       df<- as.data.frame(rbind(c(1,runif(1),100),c(2,runif(1),100),c(3,runif(1),100)))
         colnames(df)<- c("ID","v1","redundant")
         df[paste(colnames(df[2]),toString(i),sep ="_")] <- df[2] 
         df <- df[c("ID",colnames(df)[ncol(df)])] ### This works as I am referring to my new variable thorugh its column number but I still don't know how to identify the new variable, v1_i, through iterations? 
           if(i==1){
           df.final <- df
         } else {
           df.final <- merge(df.final, df, by = "ID")
         }
       }
      

      我最近从 Stata 切换到 R,虽然我曾经在 Matlab 中编写代码,但我只是需要时间来适应向量/矩阵而不是变量/面板的新风格。非常感谢对此代码的任何改进! :)

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 2021-12-18
        • 1970-01-01
        • 2013-11-07
        • 2016-11-09
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        相关资源
        最近更新 更多