修改
这个问题似乎与问题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?),我将非常感激。为什么我要这样:我创建了一个使用向量作为参数的函数,我想在数据帧的某些列上运行此函数 - 但只使用分组值作为参数而不是整列。
答案 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)
考虑by
,tapply
的面向对象的包装器,旨在按因子分割数据帧:
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