[英]r data.table conditional sum referencing / performing a lookup from another separate data.table
我是R和data.tables的初學者,但已經閱讀了足夠的信息,可以確信他們對大型數據集的速度/效率。 我搜索了高低,找不到我認為容易出問題的答案。
這是問題:給定兩個數據表DT1和DT2
DT1 <- data.table(AA=c("A","B","C","A","B","C","A","B","C","A","B","C"),
BB=c(35,45,25,25,85,15,55,55,95,35,25,75)
)
DT2 <- data.table(CC=c("A","B","C","A","B","C"),
DD=c(10,20,30,40,50,60),
EE=c(5,5,10,10,15,20)
)
如果給定DT1每行的現有值,如果滿足多個條件,如何向DT1添加一個新列(稱為NewCol),該列對DT2的EE列求和:
1)列AA =列CC
2)列DD> = BB列
換句話說,總和EE,其中AA = CC且DD> = BB。
所需的輸出是:
DT1_DesiredOutput <- data.table(AA=c("A","B","C","A","B","C","A","B","C","A","B","C"),
BB=c(35,45,25,25,85,15,55,55,95,35,25,75),
NewCol=c(10,15,30,10,0,30,0,0,0,10,15,0)
)
加入? 合並? 組? 別的什么? 猜測循環DT1的每一行效率很低?
我還想知道如何使其可擴展,即添加幾個條件(例如,幾個大於,小於,等於混合“AND”和“OR”的值)。
非常感謝!
ps,這是Excel中的一塊蛋糕( 咳嗽次優,我知道),有一個數組公式如
{=SUM(IF( ($F$7:$F$12=B7)*($G$7:$G$12>C7), $H$7:$H$12))}
復制在NewCol的每個單元格中。 我不想把這兩個Excel表格混雜在一起,顯然Excel並不是很好的原因,但是如果它在Excel中很容易,那么在R data.tables中它必須比較容易,對吧?
在最新的dev 1.9.7版本中使用非equi連接的魔力:
DT2[DT1, on = .(CC = AA, DD >= BB), .(NewCol = sum(EE, na.rm = T)), by = .EACHI]
# CC DD NewCol
# 1: A 35 10
# 2: B 45 15
# 3: C 25 30
# 4: A 25 10
# 5: B 85 0
# 6: C 15 30
# 7: A 55 0
# 8: B 55 0
# 9: C 95 0
#10: A 35 10
#11: B 25 15
#12: C 75 0
希望結果連接列的命名在將來變得更合乎邏輯,現在只需使用setnames
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.