按列R将列拆分为向量 - 与列顺序无关

时间:2018-01-06 14:40:18

标签: r list vector

修改 这个问题似乎与问题How to group a vector into a list of vectors?重复,建议回答split(df$b, df$id)。首先对解决方案感到满意,我意识到给定的答案并没有完全解决我的问题。在下面的问题中,我想获得一个列表,其中向量元素被赋值给第三列的值(在我的示例中为df$a)。这很重要,否则df$b order 会起作用。我的意思是显然我可以通过df$a安排,然后拨打split(),但也许有另一种方法可以做到这一点。

我的样本df:

df <- data_frame(id = paste0('id',rep(1:2, each = 5)), a = rep(letters[1:5],2),b=c(1:5,5:1))

Df应按ID分组(在df$id中)。我想为每个包含df$b值的组(id)元素创建一个向量列表。我的方法

require(tidyr)
spread_df <- df %>%  spread(id,b) #makes new columns for each id

#loop over spread_df
for (i in 1:length(spread_df)) {
list_group_elements [i]<- list(spread_df[[i]])

#I want each vector to be identified by the identifier of column df$a
#therefore:

names(list_group_elements[[i]]) <- list_group_elements[[1]]
}

这导致:

list_group_elements
[[1]]
 a   b   c   d   e 
"a" "b" "c" "d" "e" 

[[2]]
a b c d e 
1 2 3 4 5 

[[3]]
a b c d e 
5 4 3 2 1 

我不需要列表的第一个元素,但其余的基本上是我需要的。我有一种特殊的印象,即我的方法有点不理想,如果有人有想法改进这一点,(例如,使用dplyr?),我将非常感激。为什么我要这样:我创建了一个使用向量作为参数的函数,我想在数据帧的某些列上运行此函数 - 但只使用分组值作为参数而不是整列。

3 个答案:

答案 0 :(得分:1)

一种方法是

lapply(levels(df$id), function(L) df$b[df$id == L])
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] 5 4 3 2 1

答案 1 :(得分:1)

考虑bytapply的面向对象的包装器,旨在按因子分割数据帧:

by(df, df$id, FUN=function(i) i$b)

答案 2 :(得分:1)

您可以使用start = moment.tz('01/03/2018', 'MM/DD/YYYY', 'America/New_York').startOf('day'); df$b命名为向量,然后将setNames放入列表中:

split