【问题标题】:R - (Tidyverse) Turn one row into multiple rows based on column integerR - (Tidyverse) 根据列整数将一行转换为多行
【发布时间】:2018-07-27 23:01:44
【问题描述】:

假设我有一个包含多个观察值的数据集。有时一个单一的观察实际上是被浓缩成一个的多个观察。为了跟踪合并了多少观察值,存在一个整数值变量。

我想做的是扭转这个过程。

示例代码:

library(tidyverse)

# Example tibble
df_ex <- tibble(
  var1 = seq(1, 3),
  var2 = c('Some', 'Random', 'Text'),
  var3 = c(1, 3, 2)
)

上面的代码产生以下小标题:

# A tibble: 3 x 3
   var1 var2    var3
  <int> <chr>  <dbl>
1     1 Some       1
2     2 Random     3
3     3 Text       2

在一些 tidyverse 魔法之后,想要的小标题是:

# A tibble: 6 x 3
   var1 var2    var3
  <dbl> <chr>  <dbl>
1     1 Some       1
2     2 Random     1
3     2 Random     1
4     2 Random     1
5     3 Text       1
6     3 Text       1

【问题讨论】:

  • 多种方式df_ex %&gt;% group_by(var1) %&gt;% mutate(var3 = list(rep(1, var3))) %&gt;% unnest or df_ex %&gt;% mutate(var3 = map(var3, ~ rep(1, .x))) %&gt;% unnest or transform(df_ex[rep(seq_len(nrow(df_ex)), df_ex$var3),], var3 = 1) in base R
  • 非常好!你想把这个写成答案让我接受吗?

标签: r tidyverse


【解决方案1】:

tidyverse 中有多种方法可以做到这一点

1) 按 'var1' 进行分组(假设它是唯一的),通过复制值为 'var3' 的 1 和 @987654323 为 'var3' 创建一个 list 列@

df_ex %>%
      group_by(var1) %>% 
      mutate(var3 = list(rep(1, var3))) %>%
      unnest   

2) 使用map 获取'var3' 和unnestlist

df_ex %>%
    mutate(var3 = map(var3, ~ rep(1, .x))) %>%
    unnest

3) 使用base R,复制行序列以扩展数据,然后将transform 'var3' 复制到 1

transform(df_ex[rep(seq_len(nrow(df_ex)), df_ex$var3),], var3 = 1)

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 2017-12-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多