在R中替代dlply

时间:2016-06-22 10:13:07

标签: r dplyr plyr

我的数据框包含以下内容:

data$Value   data$Name
774          Name1
770          Name1
778          Name1
804          Name1
804          Name1
802          Name1
804          Name1
900          Name2
905          Name2
805          Name2
900          Name2
950          Name2
860          Name2
870          Name2
etc...       etc... for 100 Names

因此,每个名称都有7个与之关联的值。我想通过变量“Name”对此数据框进行分组,将其拆分并将每个名称的7个值作为列表返回。这是我想要的输出格式:

my_list$Name1 = 
[[1]]
[1] 774 770 778 804 804 802 804 

my_list$Name2 = 
[[1]]
[1] 900, 905, 805, 900, 950, 860, 870  

etc...

最简单的解决方案是使用plyr的dlply函数:

my_list <- dlply(data, "Name", function(x) list(x$Value))

但是,我想避免使用plyr。什么是一个好的选择?我考虑过以下方式分割我的数据:

splits <- function(x) { 
  y <- subset(data, select = c(Name, Value))
  splits <- split(y, y$Name)
  return(splits)
}

my_list <- splits(data)

但是,这仍然以下列格式返回一个列表:

      Value   Name
      (dbl)   (chr)
1      774    Name1
2      770    Name1
3      778    Name1
4      804    Name1
5      804    Name1
6      802    Name1
7      804    Name1

更新:解决方案:

my_list <- lapply(split(data$Value, data$Name), list) 

1 个答案:

答案 0 :(得分:3)

一种方法,

y <- subset(data, select = c(Name, Value))
list <- split(y, y$Name)

unlist(sapply(list, '[', 1))

unlist(unname(sapply(list, '[', 1)))

或简单地(赞美@docendo discimus)

unlist(unname(split(y$Value, y$Name)))

关于你的评论,你可以这样做,

unname(split(y$Value, y$Name))
#[[1]]
#[1] 774 770 778 804 804 802 804

#[[2]]
#[1] 900 905 805 900 950 860 870