R:找到> 0的值并检查数据帧中两个连续值的和?

时间:2018-09-26 21:57:40

标签: r

我有一个包含两列的数据框:年和面积(整数)。

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

我想:

  • 查找面积大于0的第一年
  • 如果找到,请检查以下项的总和 面积连续两年。如果总和> 0,则打印值的年份。否则,(如果sum = 0),在向量中搜索以下数字。

因此,在这种情况下,第一年的面积为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..elsewhile语句以移动到另一个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语句放在一起?谢谢您的帮助!

2 个答案:

答案 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