【问题标题】:Duplicate rows based on field in R [duplicate]基于R中的字段重复行[重复]
【发布时间】:2013-08-04 09:32:03
【问题描述】:

我有一个数据框df,其中包含countvalue 字段,并希望将其转换为具有value 列的数据框,其中value 的每个值都重复count 次。

除了循环之外,我实际上不知道如何执行此操作。涉及plyrreshape2(或两者)的解决方案完全可以接受。

这是我正在寻找的示例:

count value
2     10
1     20

value
10
10
20

跟进问题

如果我有 3 个字段 value1, value2, value3 必须基于 count 重复?

【问题讨论】:

  • @Tyler 的回答将适用于您的后续问题,如果您像这样省略2data.frame(dat[rep(seq_len(dim(dat)[1]), dat$count), , drop = FALSE], row.names=NULL)
  • 请养成提供代码来重现您的 data.frames 的习惯,而不仅仅是显示输出或描述它们。

标签: r dataframe


【解决方案1】:

如果您的数据框被命名为 dat,这将起作用:

dat[rep(seq_len(dim(dat)[1]), dat$count), 2]

## [1] 10 10 20

如果您希望它像您发布的那样作为数据框:

data.frame(dat[rep(seq_len(dim(dat)[1]), dat$count), 2, drop = FALSE], row.names=NULL)

##   value
## 1    10
## 2    10
## 3    20

【讨论】:

  • 这个解决方案比我提供的mapply解决方案更好,因为它返回一个数据框,正如问题所指定的那样,它可以处理多个值列的后续问题,根据@GSee 留下的评论
  • 由于这似乎是一个比较常见的问题,here's a function for it
【解决方案2】:

这是一个mapply 解决方案,假设您的数据框名为dat

do.call("c", (mapply(rep, dat$value, dat$count)))

如果你有多个值列,你可以试试

v <- do.call("c", (mapply(rep, c(dat$value1, dat$value2, dat$value3), dat$count)))

t(matrix(v, numberofvaluecolumns, byrow=T))

numberofvaluecolumns 就是你正在使用的值列的数量。不过,这会返回一个矩阵。因此,如果矩阵有问题,您必须小心。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2020-07-09
    • 2016-02-21
    • 2020-01-27
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多