我有一个data.frame
有4列和ca. 6000行。
列是:
ID
,
Day
(自考虑的时间段第一天起的天数),
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
答案 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