考虑我的列表IDs
,其中包含每个行为的数据框:
IDs <- list(Dave = data.frame(Behaviour = c("Aggression","Interaction", "Nursing"), number = c(20,10,5), duration = c(60,39,27)),James = data.frame(Behaviour = c("Aggression","Interaction"), number = c(21,30), duration = c(30,49)))
IDs
$Dave
Behaviour number duration
1 Aggression 20 60
2 Interaction 10 39
3 Nursing 5 27
$James
Behaviour number duration
1 Aggression 21 30
2 Interaction 30 49
请注意,James没有表现出任何护理行为,因此两个列表元素之间的行数不同。
我想用数据帧行切换列表元素,以便我有一个行为列表和一个ID数据帧。所以它看起来像这样:
$Aggression
ID number duration
1 Dave 20 60
2 James 21 30
$Interaction
ID number duration
1 Dave 10 39
2 James 30 49
$Nursing
ID number duration
1 Dave 5 27
我认为可以用reshape2::melt
来实现。我无法超越melt(IDs, id = "Behaviour)
有什么想法吗?
答案 0 :(得分:3)
通常,您可以分两步完成:
你可以这样做,例如:
dt <- data.table::rbindlist(IDs, id = "ID")
# or: dt <- dplyr::bind_rows(IDs, .id = "ID")
split(dt, dt$Behaviour)
注意:
如果您不想在结果中使用“行为”列并使用data.table方法,则可以将拆分修改为:
split(dt[,!"Behaviour"], dt$Behaviour)
答案 1 :(得分:1)
试试这个:
tmp<-data.frame(ID=rep(names(IDs),vapply(IDs,nrow,1L)),do.call(rbind,IDs),row.names=NULL)
split(tmp[-2],tmp$Behaviour)
#$Aggression
# ID number duration
#1 Dave 20 60
#4 James 21 30
#$Interaction
# ID number duration
#2 Dave 10 39
#5 James 30 49
#$Nursing
# ID number duration
#3 Dave 5 27
#6 James 1 17
答案 2 :(得分:1)
或使用base R
d1 <- do.call(rbind, Map(cbind, id = names(IDs), IDs))
split(d1, d1$Behaviour)