【问题标题】:R: Create a variable that uses value from previous row in a for loopR:在for循环中创建一个使用前一行的值的变量
【发布时间】:2021-12-06 11:51:19
【问题描述】:

当两行在另一个变量 (x) 上不同时,我正在尝试创建一个变量,该变量采用变量 (z) 的值。因此,如果 x 的第 1 行和第 2 行不同(从第 2 行开始),我希望 z 取 1 的值,否则取 0。

我根据这个问题 (For Loop that References the Previous Row in R) 尝试了不同的 if 和 if-else 句子,但它没有给我想要的结果。


df <-
  data.frame(
    x = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
    y = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
    z = c(0, 1, 2, 0, 0, 0, 0, 1, 1, 2)
  )

for (i in 2:length(df)) {
  df$z <- ifelse(df$x[i] != df$x[i - 1], 1, 0)
}


for (i in 2:length(df)) {
  if (df$x[i] != df$x[i - 1]) {
    df$z == 1
  } else{
    df$z == 0
  }
}

我的预期结果是:


df_expected <-
  data.frame(
    x = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
    y = c(1, 1, 2, 0, 0, 0, 0, 1, 1, 2),
    z = c(NA, 1, 1, 1, 0, 0, 0, 1, 0, 1)
  )

提前非常感谢!

【问题讨论】:

  • 为什么z == 1 是您预期的第二个条目? x的第一个和第二个条目都是1?
  • 我添加了 0,但 NA 也可以工作 - Z==1 的值对于其余分析无关紧要

标签: r dataframe for-loop if-statement


【解决方案1】:

使用data.table

library(data.table)
setDT(df)[, z := as.integer(x != shift(x, fill = first(x)))]

【讨论】:

    【解决方案2】:

    编辑 如果你需要使用for-loop,你可以使用

    df$z <- 0
    for (i in 2:nrow(df)) {
      df[i, "z"] <- +(df[i, "x"] != df[i - 1, "x"])
    }
    

    你的代码的问题是:

    df$z == 1
    

    不分配任何东西,是一个逻辑比较。


    你可以使用

    library(dplyr)
    
    df %>% 
      mutate(z = +(x != lag(x, default = first(x))))
    

    返回

       x y z
    1  1 1 0
    2  1 1 0
    3  2 2 1
    4  0 0 1
    5  0 0 0
    6  0 0 0
    7  0 0 0
    8  1 1 1
    9  1 1 0
    10 2 2 1
    

    【讨论】:

    • 感谢您的回复!我需要它在 for 循环中,因为它是一大堆代码的一部分?
    • @Mette 添加了for-loop 解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2022-01-22
    相关资源
    最近更新 更多