rbindlist data.frames的列表列并选择唯一值

rbindlist data.frames的列表列并选择唯一值,r,list,data.table,aggregate,rbindlist,R,List,Data.table,Aggregate,Rbindlist,我有一个data.table“DT”,其中有一列('col2'),该列是数据帧列表: require(data.table) DT <- data.table(col1 = c('A','A','B'), col2 = list(data.frame(colA = c(1,3,54, 23), colB = c("aa", "bb", "cc", "hh")),

我有一个data.table“DT”,其中有一列('col2'),该列是数据帧列表:

require(data.table)
DT <- data.table(col1 = c('A','A','B'),
                 col2 = list(data.frame(colA = c(1,3,54, 23), 
                                        colB = c("aa", "bb", "cc", "hh")),
                             data.frame(colA =c(23, 1),
                                       colB = c("hh", "aa")), 
                             data.frame(colA = 1,
                                       colB = "aa")))

> DT
   col1         col2
1:    A <data.frame>
2:    A <data.frame>
3:    B <data.frame>

>> DT$col2
[[1]]
  colA colB
1    1   aa
2    3   bb
3   54   cc
4   23   hh

[[2]]
  colA colB
1   23   hh
2    1   aa

[[3]]
  colA colB
1    1   aa
DT第二行(
DT[2,col2]
)的数据帧有重复的条目,每个唯一的col1只需要唯一的条目

我尝试了以下操作,但出现了一个错误

desired_output <- DT[, lapply(col2, function(x) unique(rbindlist(x))), by = col1]
# Error in rbindlist(x) : 
#   Item 1 of list input is not a data.frame, data.table or list

是否在data.table的聚合函数中使用了
rbindlist

您可以这样做:

nDT <- cbind(rbindlist(DT[[2]]), col1 = rep(DT[[1]], sapply(DT[[2]], nrow)))
nDT[!duplicated(nDT)]
   colA colB col1
1:    1   aa    A
2:    3   bb    A
3:   54   cc    A
4:   23   hh    A
5:    1   aa    B
或更一般化的基R:

names(DT[[2]]) <- DT[[1]]
ndf <- do.call(rbind, DT[[2]])
ndf$col1 <- substr(row.names(ndf), 1, 1)
unique(ndf)
名称(DT[[2]])这项工作:

DT1<-apply(DT, 1, function(x){cbind(col1=x$col1,x$col2)})
unique(rbindlist(DT1))
#   col1 colA colB
#1:    A    1   aa
#2:    A    3   bb
#3:    A   54   cc
#4:    A   23   hh
#5:    B    1   aa

DT1Group
by
'col1',在'col2'上运行
rbindlist

unique(DT[ , rbindlist(col2), by = col1]) # trimmed thanks to @snoram
#    col1 colA colB
# 1:    A    1   aa
# 2:    A    3   bb
# 3:    A   54   cc
# 4:    A   23   hh
# 5:    B    1   aa
对于每个唯一的
col1

如果为
col1
添加列,则上述表达式表示“唯一条目”(列上无条件)

亨里克的答案是保持
col1
的一种方法。另一个是:

unique(DT[, rbindlist(setNames(col2, col1), id="col1")])
我想这应该比

bycols = "col1"
unique(DT[, rbindlist(col2), by=bycols])   # Henrik's
尽管(1)
col1
不是字符列(因此适用于
setNames
)或(2)具有多个
by=
列的扩展并不明显。对于这两种情况中的任何一种,我都会使
.id
列等于
DT
的行号,然后将它们复制到:

bycols = "col1"
res = unique(DT[, rbindlist(col2, id="DT_row")])
res[, (bycols) := DT[DT_row, ..bycols]]
要将这些列放在最前面/最左边,我认为
setcolorder(res,bycols)
应该可以工作,但我使用的data.table版本太旧,无法看到它这样做


还有一个类似于
tidyr::unnest
的函数。

unique(tidyr::unnest(DT[,c(“col1”,“col2”)))
甚至可以缩短为:
unique(tidyr::unnest(DT))
我没有彻底阅读q,但是您想要的输出是
unique(DT[,rbindlist(setNames(col2,col1),id=“col1”)]
整洁!也可以缩短:
DT[,rbindlist(col2),by=col1]
也可以缩短
DT[,unique(rbindlist(col2)),by=col1]
unique(DT[, rbindlist(setNames(col2, col1), id="col1")])
bycols = "col1"
unique(DT[, rbindlist(col2), by=bycols])   # Henrik's
bycols = "col1"
res = unique(DT[, rbindlist(col2, id="DT_row")])
res[, (bycols) := DT[DT_row, ..bycols]]