【问题标题】:Using nested for-if-else on a data frame in R在 R 中的数据框上使用嵌套的 for-if-else
【发布时间】:2018-02-22 16:46:55
【问题描述】:

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

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

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

并且第N行和第N+1行的第3列和第4列的列值之差小于或等于1

那我想在N+1行点写一个新行

第 1 列和第 2 列的元素与第 N+1 行中的元素相同

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

以及第 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

【问题讨论】:

  • 在您的示例输出中,在 ccc 列中,cat fat 同时具有 minmax。对吗?
  • 是的,当第 N 行和第 N+1 行中的第 1 列和第 2 列相等时,取第 3 列的最小值和第 N 和 N+1 行之间的第 4 列的最大值。抱歉,如果不清楚
  • 抱歉,目前还不清楚。 ccc 列是第 3 列,您同时拥有 minmax。如果您现在再次说您只想要min 和第4 列的最大值ddd,那么您发布的示例输出是错误的?
  • 所有条件都必须为真才能在行之间进行比较,即对于 i=1, col[1,1]==col[2,1], col[1,2] != col[2,2],因此写一行与第1行相同。我不是要取整行的最小值,而是满足所有条件时两行之间的最小值。跨度>
  • 第 3 列会这样吗? tapply(df$ccc, paste(df$aaa, df$bbb), FUN = min).

标签: r if-statement dataframe


【解决方案1】:

我想通了。关闭发布:

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

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2018-07-08
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多