【问题标题】:Tidy data: create row for each individual, based on 'count' variable [duplicate]整洁的数据:根据“计数”变量为每个人创建行
【发布时间】:2015-06-26 00:14:06
【问题描述】:

我有一个数据框,其格式与下面给出的示例数据框 df1 非常相似。共有三列:两个分类变量和一个“计数”列,指定具有该特定组合的对象数量。

我想将此数据框移动到示例数据框 df2 中显示的格式。每个对象都简单地在单独的行上给出,而不是“计数”列。

我已经尝试过使用 dplyrtidyr 软件包,但我还不太精通 R。什么是执行我想要的功能的好方法?

set.seed(1)
x1 <- c("Pants", "Shoes", "Scarf")
x2 <- c("Ugly", "Beautiful")
x3 <- sample(1:10, size=6, replace=T)

df1 <- data.frame(Object=rep(x1, 2),
                  Quality=rep(x2, each=3),
                  Count=x3);
df1; sum(df1[,3])

df2 <- data.frame(Object=c(rep("Pants", 3), rep("Shoes", 4), rep("Scarf", 6), 
                           rep("Pants", 10), rep("Shoes", 3), rep("Scarf", 9)),
                  Quality=c(rep("Ugly", 3), rep("Ugly", 4), rep("Ugly", 6), 
                            rep("Beautiful", 10), rep("Beautiful", 3), 
                            rep("Beautiful", 9))
                 )
head(df2); tail(df2)

【问题讨论】:

  • 你可以使用base Rdf1[rep(1:nrow(df1), df1$Count),-3]
  • 谢谢!这就是我一直在寻找的,虽然我更喜欢 Ananda 的解决方案,因为这样更容易阅读代码。
  • 当然,@akrun 的建议几乎与expandRows 中的内容完全相同,但expandRows 的创建更加通用。

标签: r count dplyr tidyr


【解决方案1】:

如果你想考虑其他包,你可以试试我的“splitstackshape”包中的expandRows

用法如下:

> library(splitstackshape)
> df2 <- expandRows(df1, "Count")

> head(df2)
    Object Quality
1    Pants    Ugly
1.1  Pants    Ugly
1.2  Pants    Ugly
2    Shoes    Ugly
2.1  Shoes    Ugly
2.2  Shoes    Ugly
> tail(df2)
    Object   Quality
6.3  Scarf Beautiful
6.4  Scarf Beautiful
6.5  Scarf Beautiful
6.6  Scarf Beautiful
6.7  Scarf Beautiful
6.8  Scarf Beautiful
> nrow(expandRows(df1, "Count"))
[1] 35

【讨论】:

  • 谢谢,这就是我要找的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2021-04-03
  • 2023-01-13
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多