我想在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 :(得分: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.