2017-01-30 114 views
1

我想在for循环中生成动态列并为其赋值。以下是我的代码如何在r中动态生成for循环中的列

new_df = data.frame() 
    for(j in 1:3) { 
     new_df[,paste0("code_",j,sep="")] = somevalue 
     new_df[,paste0("target_",j,sep="")] = somevalue 
    } 

当我运行上面的代码时,它给了我一个错误。我如何动态生成上面的列?

new_df = list() 
    for(i in 1:4){ 
     for(j in 1:3){ 
      new_df[[paste0("code_",j,sep="")]] =i 
     } 
    } 
    new_df = as.data.frame(new_df) 

它只是给了我1行3列,而不是它应该返回4行3列

+0

请提供关于你的'somevalue'对象的信息。 – setempler

+0

它将是一个整数值 – Neil

+0

[在循环中填充R中的数据框]可能的重复(http://stackoverflow.com/questions/13442461/populating-a-data-frame-in-r-in-a -loop) – user2100721

回答

2

这个怎么样?

xy <- vector("list", 3) 

for (j in 1:3) { 
    x <- data.frame(j, j) 
    names(x) <- c(paste0("code_",j,sep=""), paste0("target_",j,sep="")) 
    xy[[j]] <- x 
} 

do.call(cbind, xy) 

    code_1 target_1 code_2 target_2 code_3 target_3 
1  1  1  2  2  3  3 
2

当您创建data.frame

new_df = data.frame() 

它不包含任何列,且行。

如果您现在尝试通过添加列值的向量,它抱怨比行更多的元素有关数据在data.frame

d[,'foo'] <- 'bar' 

返回

Error in `[<-.data.frame`(`*tmp*`, , "foo", value = "bar") : 
    replacement has 1 row, data has 0 

可以,例如,创建一个列表,然后转换为data.frame

new_list <- list() 
for(j in 1:3) { 
     new_list[[paste0("code_",j,sep="")]] = 1L 
     new_list[[paste0("target_",j,sep="")]] = 1L 
    } 
as.data.frame(new_list) 

返回

code_1 target_1 code_2 target_2 code_3 target_3 
1  1  1  1  1  1  1 
+0

如何追加列表?它只是返回我从其他循环中添加的最后一个值 – Neil

+0

我已编辑该问题。 – Neil

+0

我编辑了你给出的代码,但它只给出了for循环返回的最后一个值 – Neil

0

我认为,你可以使用的get/assign功能的组合和mutate做这样的操作。

library(plyr) 
df1<-data.frame(a=1:10) 
df2<-data.frame(b=11:20) 

vec1<-2:11 #values to be incorporated into df1 
vec2<-12:21#values to be incorporated into df2 

for(j in 1:2){ 
assign(paste0("newdf",j),mutate(get(paste0("df",j)),k=get(paste0("vec",j)))) 
} #assigns df1 combined with vec1, to newdf1. 
1
library(data.table) 

new_df <- 0 
new_df <- as.data.table(new_df) 
for(j in 1:3) { 
    # j<-1 
    new_df[,paste0("code_",j):=1] 
    new_df[,paste0("target_",j):=2] 
} 

您需要初始化的数据表,否则无法将列添加到它。所以如果你想让你的数据表有10行,那么只需要添加一个10个零的向量,然后做同样的事情。