代码之家  ›  专栏  ›  技术社区  ›  maycca

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

r
  •  0
  • maycca  · 技术社区  · 7 年前

    我有一个包含两列的数据框:年份和区域(整数)。

    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
    

    我想:

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


    我之前所做的:

    • 我能找到第一年和 area >0 :

      firstYear<-min(df$year[df$area > 0])
      
    • 然后计算 area 随后两年:

      sum.year = sum(subset(df, year == firstYear + 1 | year == firstYear + 2)$area)
      

    我不确定的是,如何包括 if..else while year 如果接下来两年的总和=0?

    如果…否则 陈述

    if (sum.year >0) {
        print(firstYear)
      } else firstYear = firstYear + 1 # move and check the next year
    

    虽然 循环在我的记录中移动:

    while (firstYear <= max(df$year)) {
      if (sum.year >0) {
        print(firstYear)
      } else firstYear = firstYear + 1
    }
    

    但是我不知道怎么把if..else和while语句放在一起?谢谢你的帮助!

    2 回复  |  直到 7 年前
        1
  •  1
  •   Frank    7 年前

    使用 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
    
        2
  •  0
  •   Shree    7 年前

    既然你说第六年的面积是8,我就假设你是按年份加起来的。按照这个逻辑,正确答案是第二年(第三年面积=0,第四年面积=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