【发布时间】:2016-11-18 13:04:37
【问题描述】:
我需要调整一个代码,该代码与我的数据框完美配合(但使用另一个设置),以便从 Day 列中选择 2 天的时间窗口。特别是我对前 1 天 day0 感兴趣(即 i - 1 和 i,其中 i 是感兴趣的日期),并且必须将包含在 Count 列中的 (i - 1) 值添加到第 0 天(i ) 列数。
这是我的数据框的示例:
df <- read.table(text = "
Station Day Count
1 33012 12448 4
2 35004 12448 4
3 35008 12448 4
4 37006 12448 4
5 21009 4835 3
6 24005 4835 3
7 27001 4835 3
8 25005 12447 3
9 29001 12447 3
10 29002 12447 3
11 29002 12446 3
12 30001 12446 3
13 31002 12446 3
14 47007 4834 2
15 49002 4834 2
16 47004 12445 1
17 51001 12449 1
18 51003 4832 1
19 52004 4836 1", header = TRUE)
我的输出应该是:
Station Day Count
1 33012 12448 7
2 35004 12448 7
3 35008 12448 7
4 37006 12448 7
5 21009 4835 5
6 24005 4835 5
7 27001 4835 5
8 29002 12446 4
9 30001 12446 4
10 31002 12446 4
11 51001 12449 1
12 51003 4832 1
13 52004 4836 1
14 25005 12447 0
15 29001 12447 0
16 29002 12447 0
17 47007 4834 0
18 49002 4834 0
19 47004 12445 0
我正在尝试这段代码,但它不适用于我的真实数据框:
for (i in unique(df$Day)) {
temp <- df$Count[df$Day == i]
if(length(temp > 0)) {
condition1 <- df$Day == i - 1
if (any(condition1)) {
df$Count[df$Day == i] <- mean(df$Count[condition1]) + df$Count[df$Day == i]
df$Count[condition1] <- 0
}
}
}
代码看起来正确且有意义,但我的输出不正确。
谁能帮帮我?
@aichao 代码运行良好。
如果我想考虑前 30 天(即第 30 天、第 29 天、第 28 天、....、第 1 天、第 0 天),是否有任何快速的方法来代替创建 30 个 if 语句(条件)?
再次感谢@aichao 的帮助。
【问题讨论】:
-
您可以查看
roll_apply或rollmean -
为什么 12447 = 0?不应该是6吗?
-
12447 = 0 因为我会从上到下考虑这一天。一旦考虑到第 -1 天(即取 Count 中的值并将其添加到第 0 天计数中),我将为它们分配一个 0 值。所以,按顺序,12448 - 12447 和 12446 - 12445。
-
@user181187:您的更新既不是按
Count也不是按Day排序的。在我回答的最后一行,我将结果按Count降序排列。您可以忽略print并将生成的数据框df设置为新的数据框dfSort。要按Count排序,然后是Day,按降序排列,请使用dfSort <- df[order(df$Count, df$Day, decreasing=TRUE),]而不仅仅是dfSort <- df[order(df$Count, decreasing=TRUE),]。对于升序,只需删除decreasing=TRUE参数。让我知道这是否清楚。
标签: r for-loop time dataframe window