【问题标题】:Expanding column based on another column's grouping (dplyr/tidyr) [duplicate]基于另一列的分组扩展列(dplyr/tidyr)[重复]
【发布时间】:2016-08-01 18:48:30
【问题描述】:

我正在尝试像这样转换表格:

# A tibble: 10 x 2
   user_id        pred
     <int>      <fctr>
1       27 electronics
2       27        home
3       38      health
4       60 electronics
5       60      beauty
6       92        home
7       92 electronics
8      106      health
9      117        home
10     117       women

到一个看起来像这样的:

# A tibble: 6 x 3
  user_id      pred_1      pred_2
    <dbl>       <chr>       <chr>
1      27 electronics        home
2      38      health          NA
3      60 electronics      beauty
4      92        home electronics
5     106      health          NA
6     117        home       women

即每个user_id 一行,并将pred 列扩展为pred_1pred_2 等。有什么想法吗?

更新

最初的问题已解决。跟进:

使用tidyr::spread 方法,有没有办法将group_size 限制为N,以便在传播时,最多从每个组中获取N 值?

【问题讨论】:

  • 或者使用devel版本的data.table library(data.table) ; dcast(setDT(df), user_id ~ rowid(user_id))
  • 谢谢大家,但我真的不明白这是如何与另一个问题重复的。如果有的话,这是暴露tidyr::spread 功能的更简洁的方式
  • 那里的解决方案是相同的。 SO上有几十个类似的解决方案,而其中许多是由同一用户发布的。您可以查看其中一些herehere
  • 好的。我有一个更新的问题(以及下面评论的答案的单独问题)。

标签: r dplyr reshape2 tidyr


【解决方案1】:

我们在按“user_id”分组后创建一个序列列,然后将spread从“长”到“宽”。

library(dplyr)
library(tidyr)
df1 %>%
     group_by(user_id) %>%
     mutate(id = paste0("pred_", row_number()), 
             id = factor(id, levels = unique(id))) %>%
     spread(id, pred)
#    user_id      pred_1      pred_2
#     <int>       <chr>       <chr>
#1      27 electronics        home
#2      38      health        <NA>
#3      60 electronics      beauty
#4      92        home electronics
#5     106      health        <NA>
#6     117        home       women

或者我们可以使用data.table中的dcast

library(data.table)#1.9.7+
dcast(setDT(df1), user_id~paste0("pred_", rowid(user_id)), value.var = "pred")

【讨论】:

  • 我遇到了(我认为是)一个错误,其中pred_ 值不按顺序排列。例如:我的列的顺序是pred_1pred_10pred_11,...等等。 pred_2 在第 48 列
  • @NickResnick 我更新了 dplyr/tidyr 的帖子。请检查它是否有帮助。
  • 谢谢!你也可以回答更新的问题吗?具体来说,你可以选择它创建的列数小于max_grouping吗?
  • @NickResnick 你能把它作为一个新问题发布,因为它被标记为欺骗,这似乎是一个有趣的问题。
  • 我刚做了。另外,我在这里遇到另一个错误,相同的user_id 出现在多行中,每行中只有一部分preds
猜你喜欢
  • 2017-06-12
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多