首页 文章

使用列名中的for变量添加到R中的数据框

提问于
浏览
1

我在R中有一个for循环,我想在名为rand1,rand2,rand3等的数据框中创建10个不同的变量......这是我先尝试过的:

for (rep in 1:10) {
    assign(paste('alldata200814$rand', rep, sep=""), runif(nrow(alldata200814), 0, 1))
}

但这不起作用 - 没有错误/警告信息,所以我不知道为什么,但当我尝试提交

alldata200814$rand1

它说它是NULL . 那么我将for循环更改为:

for (rep in 1:10) {
    assign(paste('rand', rep, sep=""), runif(nrow(alldata200814), 0, 1))
}

它创建变量rand1 - rand10,但现在我想将它们附加到我的数据框 . 所以我尝试过:

for (rep in 1:10) {
    assign(paste('rand', rep, sep=""), runif(nrow(alldata200814), 0, 1))
    alldata200814 <- cbind(alldata200814, paste('rand', rep, sep=""))
}

但是这只会在每一行中创建带有'rand1','rand2','rand3'等的列 . 然后我真的很接近这样做:

for (rep in 1:10) {
    data<-assign(paste('rand', rep, sep=""), runif(nrow(alldata200814), 0, 1))
    alldata200814 <- cbind(alldata200814, data)
}

但是当我希望它们是“rand1”,“rand2”,“rand3”等时,它将所有10列随机数命名为“data”...而且我不确定如何在循环中重命名它们 . 我以前在10个不同的行编程,如:

alldata200814$rand1<-runif(nrow(alldata200814), 0, 1)

但我可能不得不这样做100次而不是10次,所以我需要找到一个更好的方法来做到这一点 . 任何帮助表示赞赏,如果您需要更多信息,请告诉我们 . 谢谢!

1 回答

  • 3
    for (i in 1:10){
        alldata200814[,paste0("rand",i)] <- runif(nrow(alldata200814), 0, 1)
    }
    

    停止使用 assign . 期 . 直到你知道何时使用它,不信任任何人告诉你使用它 .

    另一个重要的习惯用语(并且比任何涉及 assign 的东西更可取)是你可以创建对象,然后在事后修改名称 . 例如,

    new_col <- matrix(runif(nrow(alldata200814) * 10,0,1),ncol = 10)
    alldata200814 <- cbind(alldata200814,new_col)
    

    现在,您可以使用 names(alldata200814) <- column_names 更改列名称 . 您甚至可以使用子集来仅分配给特定的列名,如下所示:

    df <- data.frame(x = 1:5,y = 1:5)
    names(df)[2] <- 'z'
    > df
      x z
    1 1 1
    2 2 2
    3 3 3
    4 4 4
    5 5 5
    

相关问题