我希望有人可以帮助我,尽管似乎并不难解决,但我仍然坚持了一段时间。
在创建数据框架的循环中,将值从一个数据框架复制并粘贴到另一个框架时遇到了一些问题。
我使用字符串值是因为我必须创建许多数据帧。
问题出现在最后一行set(get(paste0(letters[i],"_id")), j = 1L, value = Values_df[,i])
上,它正在将最后一列Values_df[C]
复制并粘贴到A_id
和B_id
的第一列中。
相反,我想要的是将数据帧Values_df
中其列的相应值复制到“ id
”数据帧的第一列中。
玩具示例:
rm(list = ls())
farms<-c("farm1","farm2","farm3","farm4")
qys<-expand.grid(c("Q1","Q2","Q3","Q4"),sprintf("Y%s", seq(1:10)))
qys<-paste(qys$Var2,qys$Var1)
basedata<-data.frame(matrix(NA,nrow=length(farms),ncol=length(qys)))
row.names(basedata)<-farms
colnames(basedata)<-qys
letters<-c("A","B","C")
Values_df<-data.frame(matrix(rexp(12, rate=.1), ncol=length(letters), nrow=length(farms)))
colnames(Values_df)<-letters
rownames(Values_df)<-farms
library(data.table)
for (i in 1:length(letters)){
assign(paste0(letters[i],"_id"),basedata)
set(get(paste0(letters[i],"_id")), j = 1L, value = Values_df[,i]) #PROBLEM
}
所需的输出是:
A_id[,1]<-Values_df[,1]
B_id[,1]<-Values_df[,2]
C_id[,1]<-Values_df[,3]
但是我得到了:
A_id[,1]<-Values_df[,3]
B_id[,1]<-Values_df[,3]
C_id[,1]<-Values_df[,3]
答案 0 :(得分:2)
我不太确定为什么(我怀疑assign
),但是似乎链接的data.frame(A_id,B_id ...)并没有什么不同,它们只是指向不同的名称RAM中的相同对象。
一种解决方法是使用data.table::copy
在对象的RAM中进行复制。
for (i in 1:length(letters)){
assign(paste0(letters[i],"_id"), copy(basedata))
set(get(paste0(letters[i],"_id")), NULL,j = 1L, value = Values_df[,i]) #PROBLEM
}
注意:它将解决您的问题,但正如@MichaelChirico所说,加载小型表会使您的命名空间混乱,这可能是错误的方法。
参考文献:正如@○Frank所建议的,这里是reference的副本与对data.table对象的引用。