R 在数据框创建循环内,使用data.table包中的set()将值从一个数据框复制并粘贴到另一个数据框

R 在数据框创建循环内,使用data.table包中的set()将值从一个数据框复制并粘贴到另一个数据框,r,string,loops,dataframe,data.table,R,String,Loops,Dataframe,Data.table,我希望有人能帮助我,我已经陷入这一困境一段时间了,虽然它似乎并不那么难解决 在创建数据帧的循环中,我在将值从一个数据帧复制和粘贴到另一个数据帧时遇到了一些问题 我使用字符串值是因为我必须创建许多数据帧。 问题出现在最后一行set(get(粘贴0(字母[i],“\u id”)),j=1L,value=Values\u df[,i])中,它将最后一列Values\u df[C]复制并粘贴到A\u id和B\u id的第一列。 相反,我想要的是数据框values\u df中各列的值复制到“id”数据框

我希望有人能帮助我,我已经陷入这一困境一段时间了,虽然它似乎并不那么难解决

在创建数据帧的循环中,我在将值从一个数据帧复制和粘贴到另一个数据帧时遇到了一些问题

我使用字符串值是因为我必须创建许多数据帧。 问题出现在最后一行
set(get(粘贴0(字母[i],“\u id”)),j=1L,value=Values\u df[,i])
中,它将最后一列
Values\u df[C]
复制并粘贴到
A\u id
B\u id
的第一列。 相反,我想要的是数据框
values\u 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
}
rm(list=ls())
农场我不太清楚为什么(我怀疑
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
}
NB:这将解决您的问题,但正如@MichaelChirico所说的,用大量的小表将名称空间弄乱可能是错误的做法


参考资料:如@○Frank,这是一个关于data.table对象的副本与引用的示例。

我不清楚您想要的输出。无论如何,用大量的小表来混乱名称空间可能是错误的做法。对我来说,更自然的做法是将所有数据叠加到一个长数据集中,并保持一列跟踪,
id
我只是用所需的输出和代码得到的内容编辑问题。感谢您的输入。
字母
是一个内置向量;可能最好不要覆盖它(以避免混淆)。无论如何,我同意迈克尔的观点;您可以/应该做一些更像
rbindlist(lappy(setNames(1:3,字母[1:3])、function(x)data.table(basedata,keep.rownames=TRUE)[,(2):=Values_df[[x]])、id=“let”)
而不是使用
assign
get
。如果你真的想按自己的方式来做,使用
copy(basedata)
代替
basedata
应该像Emmanuel回答的那样。
A_id[,1]<-Values_df[,3]
B_id[,1]<-Values_df[,3]
C_id[,1]<-Values_df[,3]
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
}