R

时间:2017-07-19 07:47:54

标签: r

我有以下数据框,

    R_Number    A  
    1           0  
    2           15  
    3           10  
    4           11  
    5           12  
    6           18  
    7           19  
    8           15  
    9           17  
    10          11  

现在我需要创建另一个列B,其中将计算A中值的比较。条件是比较不在两个连续行之间,即Row number 1Row number 4进行比较,明智的Row number 2Row number 5进行比较并且这种迭代一直持续到数据结束。比较结果的条件是:

     if (A[1]>=15 && A[4] <= 12) {
     B == 1  
     }
        else if (A[1]<=0 && A[4]>= 10) {
     B== 2 
     }
     else {
      B== 0 
     }

说到Row number 8 and Row number 9这些行不会有下一行要比较,因此值应为0

此外,Row 1 and 4的比较结果打印在Row number 1 Row 2 and 5的{​​{1}}打印Row number 2

因此结果数据框应如下所示

    R_Number    A       B  
    1           0       2
    2           15      1
    3           10      0 
    4           11      0
    5           12      0
    6           18      0
    7           19      1
    8           15      0
    9           17      0
    10          11      0

2 个答案:

答案 0 :(得分:2)

根据@nicola评论,我也试图解决你的问题。 我重新创建了您的初始数据框:

df <- data.frame(R_Number = c(1:10), A = c(0,15,10,11,12,18,19,15,17,11), B = 0)

所以我在一个循环中使用了一个if语句:

for (i in 1:(length(df$A)-3)) {
if (df$A[i] >= 15 && df$A[i+3] <= 12) {
  df$B[i] <- 1
  } else if ((df$A[i] <= 0) && (df$A[i+3] >= 10)) {
  df$B[i] <- 2
  }
else {
  df$B[i] <- 0
  }
}

通过上次编辑,我解决了数据帧长度发生变化时出现的问题。 现在你有一个通用的解决方案!

答案 1 :(得分:1)

首先滞后变量,然后计算你的新变量应该有效。像这样:

library(Hmisc)
df <- data.frame(R_Number = c(1:10), A = c(0,15,10,11,12,18,19,15,17,11))
A_Lag<-Lag(df$A,-3)
df$B <- rowSums(cbind(df$A>=15 & A_Lag <= 12,(df$A<=0 & A_Lag>= 10)*2),na.rm= T)
df$B

我试图避免if语句。可以在Lag包中找到Hmisc函数。

> df$B
 [1] 2 1 0 0 0 0 1 0 0 0