我有以下数据框,
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 1
与Row number 4
进行比较,明智的Row number 2
与Row 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
答案 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