2017-01-30 11 views
1

Я хочу генерировать динамические столбцы для цикла и назначать ему значения. Ниже приведен мой кодКак динамически генерировать столбцы для цикла в r

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 loop – 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 нулей, а затем выполните то же самое

Смежные вопросы