【问题标题】:Split column into vectors by group R - independent of column order按组 R 将列拆分为向量 - 与列顺序无关
【发布时间】:2018-01-06 14:40:18
【问题描述】:

编辑 这个问题似乎是问题How to group a vector into a list of vectors?的重复,建议回答split(df$b, df$id)。首先对解决方案感到满意,我意识到给定的答案并不能完全解决我的问题。在下面的问题中,我想获得一个列表,其中向量元素被分配给第三列的值(在我的示例中为df$a)。这很重要,否则df$b顺序 会起作用。我的意思是显然我可以通过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?),我们将不胜感激。为什么我想要这个:我创建了一个使用向量作为参数的函数,我想在数据帧中的某些列上运行这个函数——但只使用分组值作为参数,而不是整个列。

【问题讨论】:

  • split(df$b, df$id)
  • @Henrik,感谢您指出这一点,特别是帮助我理解您所指的繁琐问题和答案。我实际上已经看到了这个问题,并且因为它以一种对我来说不清楚的方式被问到,我认为这不是我正在寻找的。但是您当然是绝对正确的,感谢您挖掘出隐藏在评论中的问题的答案。
  • @Henrik 此外,我在想如果你能提供你的解决方案作为答案,我可以接受这个和其他没有经验的用户,因为我可以更容易地找到这个奇妙的答案,因为它不会被拉扯离开评论..
  • @Henrik,经过一番考虑,我相信所有给出的答案并不完全是我想要的。我已经编辑了我的问题,希望它能更清楚地说明我需要什么。
  • 您可以在拆分前将df$b 命名为向量:split(setNames(df$b, df$a), df$id)

标签: r list vector


【解决方案1】:

您可以使用setNamesdf$b 设为命名向量,然后将split 放入列表中:

split(setNames(df$b, df$a), df$id)
# $id1
# a b c d e 
# 1 2 3 4 5 
# 
# $id2
# a b c d e 
# 5 4 3 2 1

【讨论】:

    【解决方案2】:

    一种方法是

    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
    

    【讨论】:

    • 我想到了lapply,但没有想到要创建这个好功能。谢谢!!这回答了我的问题。极好的。 (我只能在几分钟内接受你的回答……)
    • 虽然我承认-我不太了解这个功能...哈哈。需要弄清楚这一点。
    • 为什么选择 lapply? split(df$b,df$id)
    • 是的,@Henrik 提出了这个建议,这是迄今为止最优雅的解决方案。
    • @G5W 抱歉,我不接受您的回答,因为在 Henrik 发表评论后我意识到给定的答案并没有完全解决我的问题 - 不是你的问题,但我的问题没有被准确地提出。我现在已经编辑了我的问题,我希望它能让这个问题更加清晰。
    【解决方案3】:

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

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

    【讨论】:

    • 有趣!!谢谢。不幸的是,@G5W 的答案更快,但我真的很喜欢简短的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2021-12-29
    相关资源
    最近更新 更多