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

时间:2018-06-29 10:07:00

标签: r string loops dataframe data.table

我希望有人可以帮助我,尽管似乎并不难解决,但我仍然坚持了一段时间。

在创建数据框架的循环中,将值从一个数据框架复制并粘贴到另一个框架时遇到了一些问题。

我使用字符串值是因为我必须创建许多数据帧。 问题出现在最后一行set(get(paste0(letters[i],"_id")), j = 1L, value = Values_df[,i])上,它正在将最后一列Values_df[C]复制并粘贴到A_idB_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]

1 个答案:

答案 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对象的引用。