Использование set () из пакета data.table для копирования и вставки значений из фрейма данных в другой в цикле создания фрейма данных - PullRequest
0 голосов
/ 29 июня 2018

Я надеюсь, что кто-то может мне помочь, я застрял в этом какое-то время, хотя это не так сложно решить.

У меня возникли проблемы с копированием и вставкой значений из фрейма данных в другой в цикле создания фрейма данных.

Я использую строковые значения, потому что мне нужно создать много фреймов данных. Проблема возникает в последней строке 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]

1 Ответ

0 голосов
/ 29 июня 2018

Я не совсем уверен, почему (я подозреваю, assign), но кажется, что ваши data.frame (A_id, B_id ...) не связаны, это просто разные имена, указывающие на одно и то же объект в оперативной памяти.

Обходной путь - использовать data.table::copy для копирования в ОЗУ объекта.

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, загромождение вашего пространства имен множеством крошечных таблиц, вероятно, является неправильным способом сделать это.

Ссылки: В соответствии с предложением @ ○ Фрэнка, здесь есть ссылка на копию против ссылки на объекты data.table.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...