【问题标题】:How to replace a column in a row with the next row having specific condition on that column in R?如何用R中该列具有特定条件的下一行替换一行中的列?
【发布时间】:2018-01-26 02:55:48
【问题描述】:

我正在尝试将函数应用于数据框的所有行。我基本上想检查一行的第 1 列和第 2 列中的不同条件,并尝试将第 3 列的值替换为具有特定条件的下一行中第 3 列的值。我一直在试图弄清楚如何做到这一点,但不幸的是到目前为止还没有运气。如果有人可以帮助我,我将不胜感激。

我的数据是这样的:

    Col1         col2    col3    
    duty           1       0
    duty           0       0     
    inspection     0       0
    inspection     0       

对于 col1 为“duty”且 col2==1 的每一行,如果 col1=="inspection" 在下一行,我想 pu col3==1。否则,我希望它为零。在上面提供的数据中,第 1 行是唯一具有条件的行,但是 col1!="inspection" 在下一行,因此 col3==0。但是,如果数据如下:

    Col1         col2    col3    
    duty           1       0
    duty           1       1     
    inspection     0       0
    inspection     0   

那么第二行满足所有条件,并且该行的 col3==1。
谢谢

【问题讨论】:

  • 您能否发布一个可重现的示例,说明您所拥有的、您想要比较的条件以及您正在寻找的输出?
  • 我刚刚编辑了整个内容。谢谢

标签: r if-statement dataframe replace


【解决方案1】:

您的可重现数据

df1 <- data.frame(col1=c("duty","duty","inspection","inspection"),
             col2=c(1,0,0,0),
             col3=c(0,0,0,0),
             stringsAsFactors=F)

df2 <- data.frame(col1=c("duty","duty","inspection","inspection"),
             col2=c(1,1,0,0),
             col3=c(0,1,0,0),
             stringsAsFactors=F)

使用这个函数,它使用dplyr::lag比较i-1第行

library(dplyr)
myfun <- function(df) {
              df$col3[with(df, which(col1=="inspection" & lag(col2,default=NA)==1 & lag(col1,default=NA)=="duty"))] <- 1
              return(df)
         }

输出

myfun(df1)

        col1 col2 col3
1       duty    1    0
2       duty    0    0
3 inspection    0    0
4 inspection    0    0

myfun(df2)

        col1 col2 col3
1       duty    1    0
2       duty    1    1
3 inspection    0    1
4 inspection    0    0

【讨论】:

  • 非常感谢您的回答。我想以不同的方式做到这一点,但您的解决方案似乎更短。
猜你喜欢
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
相关资源
最近更新 更多