【问题标题】:How to list the keys that share a common value from a dataframe in R? [duplicate]如何从 R 中的数据框中列出共享共同值的键? [复制]
【发布时间】:2019-08-24 10:02:23
【问题描述】:

我有一个包含两列的大型数据框(3M 行):keyvalue,我想创建一个向量列表(或任何类似的数据结构),其中包含与不同数量一样多的元素value,使得列表的元素 k 是 key 的向量,其 value 是 k。

# original dataframe:
df
# key   value
#   4       a
#   2       a
#   3       k
#  12       a

# expected output:
list
# $`a`
# [1] 4 2 12
#
# $`k`
# [1] 3

我尝试了一个循环,但它非常慢(处理 1M 行需要 6 个小时,我将它停在那里)。有没有更有效的方法?

【问题讨论】:

  • 现在好点了吗?
  • 好的,谢谢。在基础 R 中,您可以只使用 unstack(df)
  • 太棒了!这正是我想要的,在 15 秒内!非常感谢,我认为您可以发表评论作为答案。
  • 实际上,这已经被问过,所以我将它标记为原始帖子的副本,但我很高兴它对你有用。

标签: r list loops dataframe


【解决方案1】:

你可以试试tidyr::nest(),但我不知道它与你的循环相比会如何。

例子:

library(tidyr)

df <- tibble(
  id = letters,
  value = rep(1:13, 2)
)

df <- nest(df, id)

【讨论】:

  • 谢谢!它在一分钟内完成了这项工作(!),但似乎该列表没有命名。我设法通过执行以下操作访问值为 k 的 ID 列表:as.data.frame(df %&gt;% filter(value == k) %&gt;% unnest())$id,但如果可能有更实用的方法。有没有办法将数据结构转换为向量的命名列表(或类似的东西),以便我可以将其导出为 JSON(或 CSV)?
【解决方案2】:

这由 dplyr 的 group_rowsgroup_data 方法处理分组数据:

library(dplyr)

grp_df <- group_by(mtcars, gear)
group_rows(grp_df)

#[[1]]
# [1]  4  5  6  7 12 13 14 15 16 17 21 22 23 24 25
#
#[[2]]
# [1]  1  2  3  8  9 10 11 18 19 20 26 32
#
#[[3]]
#[1] 27 28 29 30 31

group_data(grp_df)

## A tibble: 3 x 2
#   gear .rows
#  <dbl> <list>
#1     3 <int [15]>
#2     4 <int [12]>
#3     5 <int [5]>

【讨论】:

  • 好的,谢谢。然后如何访问给定值的 ID?是否可以命名列表的元素?
  • 实际上这并没有提供预期的结果,因为它返回的是 ID 而不是键(我最初通过将 key 列命名为 id 表达了自己的错误,我更正了这一点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 2021-12-17
  • 1970-01-01
  • 2018-09-01
  • 2017-11-06
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多