如何在r

时间:2017-01-30 10:36:56

标签: 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列

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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个零的向量,然后执行相同的操作

答案 3 :(得分: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.