【问题标题】:Creating duplicate in R在 R 中创建副本
【发布时间】:2020-09-09 17:13:56
【问题描述】:

我有以下 4 列和 3 行的输入数据框。 时间列可以取值从 1 到该客户的成熟度列的相应值,我想为每个客户创建更多观察值,直到时间值 = 成熟度值,其他列保留其原始值。请参阅以下链接了解输入和预期输出

输入

输出

【问题讨论】:

  • 图片不是发布数据(或代码)的好方法。 Relevant xkcd。你能以dput 格式发布样本数据吗?请使用您尝试过的代码和dput(df) 的输出编辑问题

标签: r


【解决方案1】:

这是一个受dplyr 启发但不完全等于this post 的解决方案。

library(dplyr)

df <- data.frame(custno = 1:3, time = 1, dept = c("A", "B", "A"))

df %>% 
  slice(rep(1:n(), each = 5)) %>%
  group_by(custno) %>%
  mutate(time = seq_along(time))

编辑

在OP的comments之后,以下似乎更好。

一、数据:

df <- data.frame(custno = 1:3, time = 1, 
                 dept = c("A", "B", "A"),
                 maturity = c(5,4,6))

以及解决方案。

df %>% 
  tidyr::uncount(maturity) %>%
  group_by(custno) %>%
  mutate(time = seq_along(time))

【讨论】:

  • df % slice(rep(1:n(), each = df$maturity)) %>% group_by(custno) %>% mutate(time = seq_along(time))
  • 我尝试了上述方法,基本上,时间应该迭代直到每行的成熟值
  • 时间应该迭代到每行的成熟值。
  • 像宝石一样工作!谢谢
【解决方案2】:

我们也可以使用slicerow_number

library(dplyr)
library(data.table)
df %>% 
    slice(rep(row_number(), maturity)) %>%
    mutate(time = rowid(custno))

数据

df <- data.frame(custno = 1:3, time = 1, 
                 dept = c("A", "B", "A"),
                 maturity = c(5,4,6))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2016-05-29
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多