【问题标题】:Split up rows by count in column [duplicate]按列中的计数拆分行[重复]
【发布时间】:2020-10-06 09:36:27
【问题描述】:

我得到了如下布局的行:

我想把这些数据变成:

我自己还没有在 R 中尝试过任何东西,因为我所能想到的就是在循环中迭代帧,我猜 R 中有更有效的方法。你们中有人知道如何有效地实现这一点吗? ?

对于那些需要工作样本的人来说,@Ronack 的生成方法是:

df = structure(list(Date = c("23-10-2019", "24-10-2019"),
                    `30s` = c(3, 2),
                    `40s` = c(2, 1)),
               class = "data.frame", row.names = c(NA, -2L))

【问题讨论】:

标签: r


【解决方案1】:

使用pivot_longer + uncount 来自tidyr

library(tidyr)

df %>%
  pivot_longer(cols = -Date, names_to = 'measure') %>%
  uncount(value)

#  Date      measure
#  <chr>      <chr>  
#1 23-10-2019 30s    
#2 23-10-2019 30s    
#3 23-10-2019 30s    
#4 23-10-2019 40s    
#5 23-10-2019 40s    
#6 24-10-2019 30s    
#7 24-10-2019 30s    
#8 24-10-2019 40s    

数据

df <- structure(list(Date = c("23-10-2019", "24-10-2019"), `30s` = c(3, 
2), `40s` = c(2, 1)), class = "data.frame", row.names = c(NA, -2L))

【讨论】:

  • 对于那些收到错误“rep(seq_nrow(data), w) : invalid 'times' argument”错误的额外信息,请确保从生产数据集中删除所有 NA 值。
【解决方案2】:

使用data.table 包,您可以:

require(data.table)

setDT(df)
m = melt(df, id.vars = 'Date', variable.name = 'measure')
m[, .(Date = rep(Date, value)), .(measure)]

数据(来自@ronak)

df = structure(list(Date = c("23-10-2019", "24-10-2019"),
                    `30s` = c(3, 2),
                    `40s` = c(2, 1)),
               class = "data.frame", row.names = c(NA, -2L))

【讨论】:

  • 我没有投反对票,但我同意首先添加一个示例 data.frame 会很好。不管怎样,你现在加了。
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多