我有一个包含两列的数据框:年和面积(整数)。
df<-data.frame(year = 1:7,
area = c(5,0,0,8,0,8,4))
year area
1 1 5
2 2 0
3 3 0
4 4 8
5 5 0
6 6 8
7 7 4
我想:
因此,在这种情况下,第一年的面积为5。但是,接下来两年(第二年和第三年)的面积之和为0。因此,我需要在具有面积的数据框中检查新的一年。 > 0,即第四年。再次,我检查#5和#6年的总和为8(> 0)。我的预期输出是“第4年”。
我到目前为止所做的:
我可以用area >0
找到第一年的名字:
firstYear<-min(df$year[df$area > 0])
并计算接下来两年的area
的总和:
sum.year = sum(subset(df, year == firstYear + 1 | year == firstYear + 2)$area)
我不确定,如果接下来两年的总和= 0,如何包含if..else
或while
语句以移动到另一个year
?
我尝试了if..else
语句
if (sum.year >0) {
print(firstYear)
} else firstYear = firstYear + 1 # move and check the next year
但是我认为我需要包括while
循环才能遍历我的记录:
while (firstYear <= max(df$year)) {
if (sum.year >0) {
print(firstYear)
} else firstYear = firstYear + 1
}
但是我不知道如何将if..else和while语句放在一起?谢谢您的帮助!
答案 0 :(得分:1)
使用shift
将三个值放在一行上,然后测试条件:
library(data.table)
setDT(df)
w = df[, shift(area, 0:2, type="lead")][V1 > 0 & V2 + V3 > 0, which=TRUE][1]
df[w]
# year area
# 1: 4 8
在基数R中,也许这是类似的(...我不确定):
m = embed(df$area, 3)
w = which(m[, 1] > 0 & m[, 2] + m[, 3] > 0)[1]
df[w, ]
# year area
# 4 4 8
答案 1 :(得分:0)
由于您说第6年的面积是8,所以我假设您是按年累加的。按照这种逻辑,正确的答案是第2年(第3年区域= 0和第4年区域= 8)。这是使用lead
包中的dplyr
函数执行此操作的代码
library(dplyr)
df <- data.frame(#loc = rep(c("a"),each = 14),
zone = rep(c("a", "b"), 7),
year = rep(c(1:7),each= 2),
area = c(0,1,
0,0,
0,0,
3,5,
0,0,
1,7,
2,2))
x <- group_by(df, year) %>% summarize(area = sum(area))
min(which(lead(x$area, 1, 0) > 0), which(lead(x$area, 2, 0) > 0))
# [1] 2