2014-06-17 39 views
1

我在R中有一个for循环,我想在名为rand1,rand2,rand3等的数据框中创建10个不同的变量...这里是我第一次尝试:在列名中使用for变量添加到R中的数据框中

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)) 
} 

并创建变量RAND 1 - 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) 
} 

但名称随机数的全部10列的“数据”时,我想他们是“RAND 1”,“RAND 2”,“rand3”,等等。我不确定如何在循环中重命名它们。我以前这个程序在10条不同的线,如:

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

但我可能不得不这样做100次,而不是只有10个,所以我需要找到一种更好的方式来做到这一点。任何帮助表示赞赏,让我知道如果你需要更多的信息。谢谢!

回答

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

停止使用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 
+1

你应该拿到奖牌只为从开始到结束读他的问题,我在第200线某处退出... –

+0

@DavidArenburg当我点击'assign(粘贴('alldata200814 $ rand'...'在愤怒中,而不是在OP上时,我停止阅读,但是新来的R人经常陷入这个陷阱,我不知道为什么。在众神中握拳> – joran

相关问题