用数据帧行切换列表元素

时间:2017-05-12 10:34:11

标签: r list dataframe

考虑我的列表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)

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

通常,您可以分两步完成:

  1. 将列表转换为单个data.frame / data.table
  2. 根据行为分割它
  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)