R многократно обновляет фрейм данных с результатами цикла for - PullRequest
2 голосов
/ 25 февраля 2020

Я искал возможные решения и нашел что-то, что частично работает для моего приложения. Я добавляю недостающие данные в существующий фрейм данных в «чанках» через al oop. В обновлении есть строки, которых нет в основной таблице.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно вставить строки из второй таблицы, которых нет в первой таблице, и заполнить в столбце Value1 с 0, где добавляются новые строки.

(Каждый SubDF имеет длину более 50 тыс. строк, и может быть 50 SubDF для итераций по MainDF, что приводит к 2,5-миллиметровой строке MainDF )

Текущий код: (простите за кодировку l oop, она не работает. Просто используйте ее для иллюстрации)

Main_DF
df_list <- c(Sub_DF1, Sub_DF2, SubDF3)

for (i in df_list){

Sub_DF <- i

############## Code in question
setDT(Main_DF)
setDT(Sub_DF)

Main_DF[Sub_DF, 
   on=c("Path1", "Path2","File_Name", "ID"),  
   c("value2") := .(i.value2)] 
###############
}

Различные другие перестановки, которые я пробовал:

#
setDT(Main_DF)
setDT(Sub_DF)
setkeyv(Main_DF, c("Path1", "Path2","File_Name", "ID"))
setkeyv(Sub_DF, c("Path1", "Path2","File_Name", "ID"))
Main_DF<- Main_DF[Sub_DF]

#    
Main_DF<- merge(Main_DF, Sub_DF, by = c("Path1", "Path2","File_Name", "ID"), 
all = TRUE)

#
Main_DF[Sub_DF, on=c("Path1", "Path2","File_Name", "ID"),  
           c("Value2") := .(i.Value2)] 

# 
Main_DF[Sub_DF,]

#    
Main_DF<- Main_DF[Sub_DF, on=c("Path1", "Path2","File_Name", "ID")]

#    
Main_DF[Sub_DF, on=.("Path1", "Path2","File_Name", "ID"),  `:=` (Value2= 
i.Value2)] 

#
Main_DF <- merge(Main_DF,Sub_DF,by=c("Path1", "Path2","File_Name", "ID"),all 
=T, fill.NA = 0)

Main DF

Path1   Path2   File_Name   ID   Value1
root    home    Sample1     1    1
root    home    Sample1     2    0
root    home    Sample1     7    1
root    home    Sample2     1    0
root    home    Sample2     2    1
root    home    Sample2     3    1
root    home    Sample2     8    1
root    home    Sample3     1    0
root    home    Sample3     2    1
root    home    Sample3     6    1

Sub DF (1-я итерация l oop)

Path1   Path2   File_Name  ID  Value2
root    home    Sample1    1   5000
root    home    Sample1    2   9000
root    home    Sample1    5   400
root    home    Sample1    6   3500
root    home    Sample1    7   8500
root    home    Sample1    8   2200

Sub DF (2-я итерация l oop)

Path1   Path2   File_Name  ID  Value2
root    home    Sample2    1   5000
root    home    Sample2    2   9000
root    home    Sample2    3   700
root    home    Sample2    5   400
root    home    Sample2    6   3500
root    home    Sample2    7   8500
root    home    Sample2    8   2200

Sub DF (3-я итерация l oop)

Path1   Path2   File_Name  ID  Value2
root    home    Sample3    1   5000
root    home    Sample3    2   9000
root    home    Sample3    5   400
root    home    Sample3    6   3500
root    home    Sample3    7   8500
root    home    Sample3    8   2200

АКТУАЛЬНО Обновлен основной DF (после итерации 3-х SubDF)

Path1   Path2   File_Name   ID   Value1   Value2
root    home    Sample1     1    1        5000
root    home    Sample1     2    0        9000
root    home    Sample1     7    1        8500
root    home    Sample2     1    0        5000   
root    home    Sample2     2    1        9000
root    home    Sample2     3    1        700 
root    home    Sample2     8    1        8800
root    home    Sample3     1    0        5000 
root    home    Sample3     2    1        9000
root    home    Sample3     6    1        3500

DESIRED Обновлено Main DF

Path1   Path2   File_Name   ID   Value1   Value2
root    home    Sample1     1    1        5000
root    home    Sample1     2    0        9000
root    home    Sample1     5    1        400
root    home    Sample1     6    1        3500
root    home    Sample1     7    0        8500
root    home    Sample1     8    0        2200
root    home    Sample2     1    0        5000
root    home    Sample2     2    1        9000
root    home    Sample2     3    1        700
root    home    Sample2     5    0        400
root    home    Sample2     6    0        3500
root    home    Sample2     7    0        8500
root    home    Sample2     8    1        2200
root    home    Sample3     1    0        5000
root    home    Sample3     2    1        9000
root    home    Sample3     5    0        400
root    home    Sample3     6    1        3500
root    home    Sample3     7    0        8500
root    home    Sample3     8    0        2200 

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Если я не ошибаюсь, это должно быть то, что вы ищете:

rbindlist(list(Sub_DF1, Sub_DF2, Sub_DF3))[
    Main_DF, on=.(Path1, Path2, File_Name, ID), Value1 := i.Value1][
        is.na(Value1), Value1 := 0L][]

вывод:

    Path1 Path2 File_Name ID Value2 Value1
 1:  root  home   Sample1  1   5000      1
 2:  root  home   Sample1  2   9000      0
 3:  root  home   Sample1  5    400      0
 4:  root  home   Sample1  6   3500      0
 5:  root  home   Sample1  7   8500      1
 6:  root  home   Sample1  8   2200      0
 7:  root  home   Sample2  1   5000      0
 8:  root  home   Sample2  2   9000      1
 9:  root  home   Sample2  3    700      1
10:  root  home   Sample2  5    400      0
11:  root  home   Sample2  6   3500      0
12:  root  home   Sample2  7   8500      0
13:  root  home   Sample2  8   2200      1
14:  root  home   Sample3  1   5000      0
15:  root  home   Sample3  2   9000      1
16:  root  home   Sample3  5    400      0
17:  root  home   Sample3  6   3500      1
18:  root  home   Sample3  7   8500      0
19:  root  home   Sample3  8   2200      0

данные:

library(data.table)
Main_DF <- fread("Path1   Path2   File_Name   ID   Value1
root    home    Sample1     1    1
root    home    Sample1     2    0
root    home    Sample1     7    1
root    home    Sample2     1    0
root    home    Sample2     2    1
root    home    Sample2     3    1
root    home    Sample2     8    1
root    home    Sample3     1    0
root    home    Sample3     2    1
root    home    Sample3     6    1")

Sub_DF1 <- fread("Path1   Path2   File_Name  ID  Value2
root    home    Sample1    1   5000
root    home    Sample1    2   9000
root    home    Sample1    5   400
root    home    Sample1    6   3500
root    home    Sample1    7   8500
root    home    Sample1    8   2200")

Sub_DF2 <- fread("Path1   Path2   File_Name  ID  Value2
root    home    Sample2    1   5000
root    home    Sample2    2   9000
root    home    Sample2    3   700
root    home    Sample2    5   400
root    home    Sample2    6   3500
root    home    Sample2    7   8500
root    home    Sample2    8   2200")

Sub_DF3 <- fread("Path1   Path2   File_Name  ID  Value2
root    home    Sample3    1   5000
root    home    Sample3    2   9000
root    home    Sample3    5   400
root    home    Sample3    6   3500
root    home    Sample3    7   8500
root    home    Sample3    8   2200")
0 голосов
/ 26 февраля 2020

Так что это была не та реализация, которую я искал, но решение @ chinsoon12 работает по-другому.

В l oop, который обрабатывает SubDF, я назначаю rbind новому фрейму данных , Затем я помещаю этот меньший кадр данных в свою базу данных до повторного выполнения l oop, перезаписывая этот кадр следующими данными SubDF.

Это был один из способов, которые я планировал рассмотреть, если бы мог не получается присоединиться к data.table так, как я надеялся.

Спасибо за помощь!

...