【问题标题】:Create duplicated rows by filling groups in a data.frame通过在 data.frame 中填充组来创建重复的行
【发布时间】:2017-06-03 01:53:58
【问题描述】:

这是我的示例 data.frame:

df = read.table(text = 'ID Day Count Count_group
                18  1933    6   15
                33  1933    6   15
                37  1933    6   15
                18  1933    6   15
                16  1933    6   15
                11  1933    6   15
                111 1932    5   9
                34  1932    5   9
                60  1932    5   9
                88  1932    5   9
                18  1932    5   9
                33  1931    3   4
                13  1931    3   4
                56  1931    3   4
                23  1930    1   1
                6   1800    6   12
                37  1800    6   12
                98  1800    6   12
                52  1800    6   12
                18  1800    6   12
                76  1800    6   12
                55  1799    4   6
                6   1799    4   6
                52  1799    4   6
                133 1799    4   6
                112 1798    2   2
                677 1798    2   2
                778 888     4   8
                111 888     4   8
                88  888     4   8
                10  888     4   8
                37  887     2   4
                26  887     2   4
                8   886     1   2
                56  885     1   1
                22  120     2   6
                34  120     2   6
                88  119     1   6
                99  118     2   5
                12  118     2   5
                90  117     1   3
                22  115     2   2
                99  115     2   2', header = TRUE)

Count 列显示DayID 观察的数量; Count_group 显示 IDDay 及其前 4 天内的观察次数。

我需要扩展 df 以便拥有每个 Count_group 剧集中的所有天数。

预期输出:

ID  Day Count   Count_group
18  1933    6   15
33  1933    6   15
37  1933    6   15
18  1933    6   15
16  1933    6   15
11  1933    6   15
111 1932    5   15
34  1932    5   15
60  1932    5   15
88  1932    5   15
18  1932    5   15
33  1931    3   15
13  1931    3   15
56  1931    3   15
23  1930    1   15
6   1800    6   12
37  1800    6   12
98  1800    6   12
52  1800    6   12
18  1800    6   12
76  1800    6   12
55  1799    4   12
6   1799    4   12
52  1799    4   12
133 1799    4   12
112 1798    2   12
677 1798    2   12
111 1932    5   9
34  1932    5   9
60  1932    5   9
88  1932    5   9
18  1932    5   9
33  1931    3   9
13  1931    3   9
56  1931    3   9
23  1930    1   9
778 888    4    8
111 888    4    8
88  888    4    8
10  888    4    8
37  887    2    8
26  887    2    8
8   886    1    8
56  885    1    8
55  1799   4    6
6   1799   4    6
52  1799   4    6
133 1799   4    6
112 1798   2    6
677 1798   2    6
22  120    2    6
34  120    2    6
88  119    1    6
88  119    1    6
99  118    2    6
12  118    2    6
99  118    2    6
12  118    2    6
90  117    1    6
90  117    1    6
22  115    2    6
99  115    2    6
99  118    2    5
12  118    2    5
90  117    1    5
22  115    2    5
99  115    2    5
33  1931   3    4
13  1931   3    4
56  1931   3    4
23  1930   1    4
37  887    2    4
26  887    2    4
8   886    1    4
56  885    1    4
90  117    1    3
22  115    2    3
99  115    2    3
112 1798   2    2
677 1798   2    2
8   886    1    2
56  885    1    2
22  115    2    2
99  115    2    2
23  1930   1    1
56  885    1    1

输出说明:

1) Day 1933 在这一天(Count col)有 6 个 ID,从 Day 1933 到 Day 1929(Count_group col)总共有 15 个 ID。值 15 来自 6 (Day 1933) + 5 (1932) + 3 (1931) + 1 (1930) + 0 (1929)。因此,在输出中,我添加了 Count_group = 15 集内的所有剩余天数。

2) Next Day 按降序排列是 1932。在这一天有 5 个 ID,从 1932 年到 1928 年总共有 9 个 ID。值 9 来自 5 (1932) + 3 (1931) + 1 (1930) ) + 0 (1929) + 0 (1928)。在输出(第 28 行)中,您将看到 1932 年完整(5 天)一集,总共 9 行。

3) 第二天是 1931..等等..

输出 data.frame 按 Count_group 和 Day 排序,均递减 = TRUE。

我正在尝试创建一个不仅适用于 5 天窗口(如上)而且适用于任何 n 天时间窗口的代码。

你有什么建议吗?

谢谢

【问题讨论】:

  • ok..你能试试吗?
  • 我不完全理解您是如何从数据获得预期输出的,但您可能可以使用tidyr::complete()。也许看到这个question,或this one
  • 我有点困惑。我们如何为您创建新行。有哪些简单明了的规则?写下您无法弄清楚如何编码的过程。我们如何计算这些列中的新值以帮助您?请将回复发布为对您问题的修改。
  • 已添加信息。实际上没有要创建的新数据。我只需要每个 Count_group 剧集的重复值,这些值需要根据 Count_group 剧集进行分组。谢谢

标签: r dataframe duplicates rows fill


【解决方案1】:

试试这个,告诉我你是不是这样想的:

# First I split the dataframe by each day using split()
duplicates <- lapply(split(df, df$Day), function(x){
  if(nrow(x) != x[1,"Count_group"]) { # check if # of rows != the number you want
    x[rep(1:nrow(x), length.out = x[1,"Count_group"]),] # repeat them until you get it
  } else {
    x
  }
})

df2 <- do.call("rbind.data.frame", duplicates) # turn the list back into a dataframe
df3 <- df2[order(df2[,"Count_group"], df2[,"Day"], decreasing = T), ] # orderby Day & count
rownames(df3) <- NULL # names back to 1:X instead of the generated ones
df3 # the result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2016-02-07
    • 2016-05-09
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多