rbindlist data.frames的列表列并选择唯一值
我有一个data.table“DT”,其中有一列('col2'),该列是数据帧列表: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")),
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
DT1Groupby
'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]]