Насколько я понял намерения ОП из множества комментариев, он хочет обновить фрейм данных giraffe
с помощью имени многих других фреймов данных, где runkey
соответствует.
Этого можно добиться, объединив другие фреймы данных в один объект data.table, обрабатывая имена фреймов данных как данные и, наконец, обновив giraffe
в соединении.
Образец данных
Согласно OP, giraffe
состоит из 500 строк и 5 столбцов, включая runkey
и project
. project
инициализируется здесь как столбец символов для последующего соединения с именами фреймов данных.
set.seed(123L) # required for reproducible data
giraffe <- data.frame(runkey = 1:500,
X2 = sample.int(99L, 500L, TRUE),
X3 = sample.int(99L, 500L, TRUE),
X4 = sample.int(99L, 500L, TRUE),
project = "",
stringsAsFactors = FALSE)
Затем есть ряд фреймов данных, которые содержат только один столбец runkey
. Согласно OP, runkey
является дизъюнктным, т. Е. Объединенный набор всех runkey
не содержит дубликатов.
spine_hlfs <- data.frame(runkey = c(1L, 498L, 5L))
ir_dia <- data.frame(runkey = c(3L, 499L, 47L, 327L))
Предложенное решение
# specify names of data frames
df_names <- c("spine_hlfs", "ir_dia")
# create named list of data frames
df_list <- mget(df_names)
# update on join
library(data.table)
setDT(giraffe)[rbindlist(df_list, idcol = "df.name"), on = "runkey", project := df.name][]
runkey X2 X3 X4 project
1: 1 2 44 63 spine_hlfs
2: 2 73 99 77
3: 3 43 20 18 ir_dia
4: 4 73 12 40
5: 5 2 25 96 spine_hlfs
---
496: 496 75 45 84
497: 497 24 63 43
498: 498 33 53 81 spine_hlfs
499: 499 1 33 16 ir_dia
500: 500 99 77 41
Объяснение
setDT()
принуждает giraffe
к data.table
. rbindlist(df_list, idcol = "df.name")
создает комбинированную data.table из списка фреймов данных, тем самым заполняя столбец df.name
именами элементов списка:
df.name runkey
1: spine_hlfs 1
2: spine_hlfs 498
3: spine_hlfs 5
4: ir_dia 3
5: ir_dia 499
6: ir_dia 47
7: ir_dia 327
Этот промежуточный результат объединяется runkey
с giraffe
. Столбец project
обновляется содержимым df.name
только для совпадающих строк.
Альтернативное решение
Это зацикливается на df_names
и выполняет повторяющиеся соединения, которые обновляют giraffe
на месте:
setDT(giraffe)
for (x in df_names) giraffe[get(x), on = "runkey", project := x]
giraffe[]
06.12.2017
dataframes
в списке и переберите их, чтобы заменить записи, где у вас есть соответствующиеrunkeys
. Вattach
определенно нет необходимости! Я обновил свой пример, чтобы показать вам работающий минимальный пример с двумя запросамиdataframes
. 06.12.2017for
. Возможно, вы читали о циклахfor
и о том, как их вообще избежать в R. В основном это правда, но не в целом (история более сложная и восходит к старому S-plus). Это отличный пример хорошего использования циклаfor
. Я обновил свой пример, заменив записи именем базы данных запросов. Это должно быть то, что вам нужно.attach
— это зло, и его следует избегать. 06.12.2017dataframe
, которую вы передаете в качестве аргумента функции (это потому, что R не знает о передаче объектов по ссылке). Таким образом, вам понадобится (как минимум) в два раза больше памяти только для хранения/чтения одногоdataframe
. 06.12.2017fortunes::fortune(236)
говорит: Функция назначения должна использоваться только теми, кто полностью понимает, почему вам никогда не следует использовать функцию назначения. -- Грег Сноу R-help (июль 2009 г.) 06.12.2017assign
. Благодарю за разъяснение. Я уже разместил ссылку на сообщение SO, в котором обсуждались опасностиassign
выше. 06.12.2017