在R中的数据框上使用嵌套的for-if-else

时间:2018-02-22 16:46:55

标签: r if-statement dataframe

我正在尝试使用嵌套在for循环中的if-else循环来遍历数据帧,并根据第一个df的条件输出新的数据帧。

在这个数据框中,我想比较每一行N和行N + 1,

如果列元素在第1列和第2列中匹配

第3列和第4行中第N行和第N + 1行的列值之间的差异小于或等于1

然后我想在N + 1行点

中写一个新行

与第1行和第2行具有相同的元素,与行N + 1

中的元素相同

和第3列的最小值,比较第3列的N和N + 1

和第4列的最大值,用于比较第4列的N和N + 1

示例:

aaa <- c(rep("cat",4), "dog", "dog")
bbb <- c("fit", rep("fat",2), rep("fat", 3))
ccc <- c(6,5,6,9,9,9)
ddd <- c(11,10,10,22,23,24)
df <- data.frame(aaa,bbb,ccc,ddd)

从这里开始:

 aaa bbb ccc ddd
 cat fit   6  11
 cat fat   5  10
 cat fat   6  10
 cat fat   9  22
 dog fat   9  23
 dog fat   9  24

到期望的输出:

 aaa bbb ccc ddd
 cat fit   6  11
 cat fat   5  10
 cat fat   9  22
 dog fat   9  24

我的尝试是这样的:

result <- data.frame()
for (i in c(1:as.numeric(nrow(df))-1)){      
  if(df[i,1] == df[i+1,1]
     &
     df[i,2] == df[i+1,2]
     &
     abs(df[i,3]-df[i+1,3]) <=1
     &
     abs(df[i,4]-df[i+1,4]) <=1)       
   {
    result[i+1,] <- c(df[i,1],df[i,2],min(df[i,3],df[i+1,3]),max(df[i,4],df[i+1,4]))
    result[i,] <- c(NA,NA,NA,NA)
    } else {
    result[i,] <- df[i,]
    }
}
result

1 个答案:

答案 0 :(得分:0)

我明白了。发布关闭:

result <- df
for (i in c(1:as.numeric(nrow(df)-1))){
  if(df[i,1] == df[i+1,1] &
     df[i,2] == df[i+1,2] &
     abs(df[i,3]-df[i+1,3])<=1 &
     abs(df[i,4]-df[i+1,4])<=1) {
    result[i+1,3] <- min(df[i,3],df[i+1,3])
    result[i+1,4] <- max(df[i,4],df[i+1,4])
    result[i,] <- c(NA,NA,NA,NA)
    } 
}
result <- na.omit(result)
result