【问题标题】:Expanding data frame using tidyverse [duplicate]使用 tidyverse 扩展数据框
【发布时间】:2017-01-04 19:02:07
【问题描述】:

这是我正在尝试做的一个示例:

df <- data.frame(
  id = letters[1:5],
  enum_start = c(1, 1, 1, 1, 1),
  enum_end = c(1, 5, 3, 7, 2)
)

df2 <- df %>%
  split(.$id) %>%
  lapply(function(x) cbind(x, hello = seq(x$enum_start, x$enum_end, by = 1L))) %>%
  bind_rows
df2
#     id enum_start enum_end hello
# 1   a          1        1  1
# 2   b          1        5  1
# 3   b          1        5  2
# 4   b          1        5  3
# 5   b          1        5  4
# 6   b          1        5  5
# 7   c          1        3  1
# 8   c          1        3  2
# 9   c          1        3  3
# 10  d          1        7  1
# 11  d          1        7  2
# 12  d          1        7  3
# 13  d          1        7  4
# 14  d          1        7  5
# 15  d          1        7  6
# 16  d          1        7  7
# 17  e          1        2  1
# 18  e          1        2  2

请注意,hello 的起始值和结束值取决于数据,因此每个 id 的行数是动态的。我正在寻找可能涉及来自 tidyr 的 expand 但我正在苦苦挣扎的解决方案。

【问题讨论】:

  • hello 代表什么?
  • 与data.table 你可以这样做:setDT(df)[,list(enum_start,enum_end,hello=seq(enum_start,enum_end)),by=id]

标签: r dplyr tidyr tidyverse


【解决方案1】:

这是一个 dplyr/tidyr 方法

group_by(df, id) %>% 
  expand(enum_start, enum_end, hello = full_seq(enum_end:enum_start, 1))

不确定是否有不分组数据的整洁方式(知道会很有趣)

【讨论】:

    【解决方案2】:

    这是产生所需输出的基本 R 方法。

    dfNew <- within(df[rep(seq_len(nrow(df)), df$enum_end), ],
                    hello <- sequence(df$enum_end))
    

    sequence 将返回自然数并采用允许重复重新计数的向量。它用于生成“hello”变量。 within 减少输入并返回修改后的 data.frame。我给它提供了一个扩展版本的 df,其中使用 rep 和 [ 重复行。

    dfNew
        id enum_start enum_end hello
    1    a          1        1     1
    2    b          1        5     1
    2.1  b          1        5     2
    2.2  b          1        5     3
    2.3  b          1        5     4
    2.4  b          1        5     5
    3    c          1        3     1
    3.1  c          1        3     2
    3.2  c          1        3     3
    4    d          1        7     1
    4.1  d          1        7     2
    4.2  d          1        7     3
    4.3  d          1        7     4
    4.4  d          1        7     5
    4.5  d          1        7     6
    4.6  d          1        7     7
    5    e          1        2     1
    5.1  e          1        2     2
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2021-03-15
      • 2016-08-19
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多