簡體   English   中英

R-data.table行中的不可透視列表

[英]R - unpivot list in data.table rows

我有一個包含幾個列的數據集,其中包括帶有列表條目的1列:

DT = data.table(
  x = c(1:5),
  y = seq(2, 10, 2),
  z = list(list("a","b","a"), list("a","c"), list("b","c"), list("a","b","c"), list("b","c","b"))
)

基本上,我試圖從z列中取消列出a,b,c,並基於x和y值匯總數據。

所需的輸出:

    z x sum(y)
 1: a 1  4
 2: b 1  2
 3: a 2  4
 4: c 2  4
 5: b 3  6
 6: c 3  6
 7: a 4  8
 8: b 4  8
 9: c 4  8
10: b 5 20
11: c 5 10

我當前的方法是四處循環。 我在列表中創建了另外兩個具有x和y值的列,其長度與z列中的列表條目的長度相同,然后在匯總之前同時取消列出所有3列-即y值之和,按z和x分組。

代碼(取消列出和聚合之前):

DT[, listlen := sapply(z, function(x) length(x))]
for (a in c(1:nrow(DT))){
  DT[a, x1:= list(list(rep(DT[a, x], DT[a, listlen])))]
  DT[a, y1:= list(list(rep(DT[a, y], DT[a, listlen])))]}
DT_out = data.table(x = unlist(DT[,x1]), y = unlist(DT[,y1]), z = unlist(DT[,z]))

   x  y      z listlen    x1       y1
1: 1  2 <list>       3 1,1,1    2,2,2
2: 2  4 <list>       2   2,2      4,4
3: 3  6 <list>       2   3,3      6,6
4: 4  8 <list>       3 4,4,4    8,8,8
5: 5 10 <list>       3 5,5,5 10,10,10

是否有通過data.table或reshape包提供的方法可以幫助我融化數據集/這樣簡單嗎? 因為我要處理的行比這多得多,所以此步驟似乎效率很低。

關於聚合步驟的任何其他幫助也將不勝感激!

unlist z列,然后按照常規通過by=匯總:

DT[, .(z=unlist(z)), by=.(x,y)][, .(sumy=sum(y)), by=.(x,z)]

#    x z sumy
# 1: 1 a    4
# 2: 1 b    2
# 3: 2 a    4
# 4: 2 c    4
# 5: 3 b    6
# 6: 3 c    6
# 7: 4 a    8
# 8: 4 b    8
# 9: 4 c    8
#10: 5 b   20
#11: 5 c   10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM