data.frame - 在3天的时间内独立观察

时间:2016-07-12 15:36:51

标签: r dataframe

我有一个data.frame有4列和ca. 6000行。

列是:

IDDay(自考虑的时间段第一天起的天数), Year(记录观察的年份)和 Count(在特定日期内所有ID之间汇总的观察数量)。

df = read.table(text = 'ID     Day         Year   Count
        33012   12448         2001      46
        35004   12448         2001      46
        35008   12448         2001      46
        37006   12448         2001      46
        21009    4835         1980      44
        24005    4835         1980      44
        27001    4835         1980      44
        27002    4835         1980      44
        25005    5569         1982      34
        29001    5569         1982      34
        29002    5569         1982      34
        30003    5569         1982      34', header = TRUE)

我需要创建一个三天的时间窗口并为每一天运行一个for循环,计算该时间范围内的观察数量。

e.g。从第12448天开始(或#34;第0天和第34天;)我需要检查第12447天(前一天或"第-1天和第34天;)和第12449天(第二天或之后)的所有数据帧#34;日+ 1")如果存在观察记录。 换句话说,取di = 12448,存在任何" di + 1"和/或" di -1"在数据框中? 如果是,我必须从数据框中删除" di + 1"和/或" di -1"为了避免重叠并添加他们的" Count"价值进入" di" ""伯爵"观察。

你有任何可以帮我制作for循环的提示吗?

@thepule,非常感谢。我试图在我的数据集中运行您的代码。因此,我在列中的所有日子创建了一个向量" Day"

days <- unique(df$Day)

并适当地调整了for循环,但它没有起作用,因为我在列Count中获得了非常低的值。

错误在哪里?

这是我的数据框的一个例子:

df = read.table(text ='ID    Day       Year     Count
         33012  12448       2001         5
         35004  12448       2001         5
         35008  12448       2001         5
         37006  12448       2001         5
         37008  12448       2001         5
         27900  12800       2002         4
         27987  12800       2002         4
         27123  12800       2002         4
         27341  12800       2002         4
         56124  14020       2003         3
         12874  14020       2003         3
         11447  14020       2003         3
         11231  12447       2001         2
         31879  12447       2001         2
         56784  12449       2001         1
         64148  12799       2002         1
         45613  12801       2001         1
         77632  10324       1991         1
         55313  14002       2003         1
         11667  14019       2003         1', header = TRUE)

在for循环之后,我的输出应该是:

         ID    Day       Year     Count
1     33012  12448       2001         8
2     35004  12448       2001         8
3     35008  12448       2001         8
4     37006  12448       2001         8
5     37008  12448       2001         8
6     27900  12800       2002         6
7     27987  12800       2002         6
8     27123  12800       2002         6
9     27341  12800       2002         6
10    56124  14020       2003         4
11    12874  14020       2003         4
12    11447  14020       2003         4
13    77632  10324       1991         1
14    55313  14002       2003         1

n.b每个ID的每个观察结果每年最多1次。 n.b.b. Count列的排序方式为decrease = TRUE

1 个答案:

答案 0 :(得分:0)

更新回答:

# Create data frame    
tt <- read.table(text = "
        ID    Day       Year     Count
 33012  12448       2001         5
 35004  12448       2001         5
 35008  12448       2001         5
 37006  12448       2001         5
 37008  12448       2001         5
 27900  12800       2002         4
 27987  12800       2002         4
 27123  12800       2002         4
 27341  12800       2002         4
 56124  14020       2003         3
 12874  14020       2003         3
 11447  14020       2003         3
 11231  12447       2001         2
 31879  12447       2001         2
 56784  12449       2001         1
 64148  12799       2002         1
 45613  12801       2001         1
 77632  10324       1991         1
 55313  14002       2003         1
 11667  14019       2003         1", header= T)


# Vector of day targets you want to repeat the procedure for
targets <- unique(tt$Day)


for (i in targets) {
    temp <- tt$Count[tt$Day == i]
    if(length(temp >0)) {
            condition <- tt$Day == i - 1
            if(any(condition)) {
                    tt$Count[tt$Day == i] <- mean(tt$Count[condition]) +  tt$Count[tt$Day == i]
                    tt <- tt[!condition,]
            }
            condition2 <- tt$Day == i + 1
            if(any(condition2)) {
                    tt$Count[tt$Day == i] <- mean(tt$Count[condition2]) +  tt$Count[tt$Day == i]
                    tt <- tt[!condition2,]
    }

    }
}

输出:

tt
  ID   Day Year Count
1  33012 12448 2001     8
2  35004 12448 2001     8
3  35008 12448 2001     8
4  37006 12448 2001     8
5  37008 12448 2001     8
6  27900 12800 2002     6
7  27987 12800 2002     6
8  27123 12800 2002     6
9  27341 12800 2002     6
10 56124 14020 2003     4
11 12874 14020 2003     4
12 11447 14020 2003     4
18 77632 10324 1991     1
19 55313 14002 2003     1