【问题标题】:R - Lag not working within function [objective: match similar adjacent rows]R - 滞后在函数内不起作用[目标:匹配相似的相邻行]
【发布时间】:2021-02-23 06:32:00
【问题描述】:

我最近尝试根据两个变量匹配 相邻 数据框中的相同行(下面的 Condition1 和 Outcome1)。我见过有人对所有行执行此操作,但不是对相邻行执行此操作,这就是为什么我开发了以下三步解决方法(我希望不会过度思考):

-我滞后了我希望进行匹配的变量。

-我比较了变量和滞后变量

-我删除了所有相同的行(并删除了剩余的不必要的列)。

Case <- c("Case 1", "Case 2", "Case 3", "Case 4", "Case 5")
Condition1 <- c(0, 1, 0, 0, 1)
Outcome1 <- c(0, 0, 0, 0, 1)
mwa.df <- data.frame(Case, Condition1, Outcome1)

new.df <- mwa.df
Condition_lag <- c(new.df$Condition1[-1],0)
Outcome_lag <- c(new.df$Outcome1[-1],0)
new.df <- cbind(new.df, Condition_lag, Outcome_lag)
new.df$Comp <- 0
new.df$Comp[new.df$Outcome1 == new.df$Outcome_lag & new.df$Condition1 == new.df$Condition_lag] <- 1
new.df <- subset(new.df, Comp == 0)
new.df <- subset(new.df, select = -c(Condition_lag, Outcome_lag, Comp))

这工作得很好。但是当我尝试为这个创建一个函数时,因为我必须对大量的数据帧进行这个操作,我遇到了lag不起作用的问题(即未执行condition_lag &lt;- c(new.df$condition[-1],0)outcome_lag &lt;- c(new.df$outcome[-1],0) 操作)。功能代码为:

FLC.Dframe <- function(old.df, condition, outcome){
      new.df <- old.df
      condition_lag <- c(new.df$condition[-1],0)
      outcome_lag <- c(new.df$outcome[-1],0)
      new.df <- cbind(new.df, condition_lag, outcome_lag)
      new.df$comp <- 0
      new.df$comp[new.df$outcome == new.df$outcome_lag & new.df$condition == new.df$condition_lag] <- 1
      new.df <- subset(new.df, comp == 0)
      new.df <- subset(new.df, select = -c(condition_lag, outcome_lag, comp))
      return(new.df)
}

关于函数的使用,我写了new.df &lt;- FLC.Dframe(mwa.df, Condition1, Outcome1)

有人可以帮我解决这个问题吗?非常感谢。

【问题讨论】:

  • 感谢您的帮助。我调查了一下,这似乎在基于 one 变量进行匹配时有效。但是,我需要比较 两个(或更多) 变量。
  • 然后勾选data.table::rleid这个函数,可以指定多个变量
  • 再次感谢!我尽了最大努力,但我无法用rleid() 编写代码来解决问题。请问你会怎么做? [另外,请问您是否知道我上面的功能为什么不起作用?]

标签: r function matching lag


【解决方案1】:

只需生成运行长度 ID 并删除重复项。

with(mwa.df, mwa.df[!duplicated(data.table::rleid(Condition1, Outcome1)), ])

输出

    Case Condition1 Outcome1
1 Case 1          0        0
2 Case 2          1        0
3 Case 3          0        0
5 Case 5          1        1

如果你想要一个函数,那么

FLC.Dframe <- function(df, cols) df[!duplicated(data.table::rleidv(df[, cols])), ]

这样调用这个函数

> FLC.Dframe(mwa.df, c("Condition1", "Outcome1"))

    Case Condition1 Outcome1
1 Case 1          0        0
2 Case 2          1        0
3 Case 3          0        0
5 Case 5          1        1

您的函数的主要问题涉及$ 的错误使用。此运算符按原样处理 RHS 输入。例如,在new.df$condition 这一行中,$ 运算符尝试在new.df 中查找名为"condition" 的列,但不是"Condition1",即condition 的值。如果你按如下方式重写你的函数,那么它应该可以工作。

FLC.Dframe <- function(old.df, condition, outcome){
  new.df <- old.df
  condition_lag <- c(new.df[[condition]][-1],0)
  outcome_lag <- c(new.df[[outcome]][-1],0)
  new.df <- cbind(new.df, condition_lag, outcome_lag)
  new.df$comp <- 0
  new.df$comp[new.df[[outcome]] == new.df[["outcome_lag"]] & new.df[[condition]] == new.df[["condition_lag"]]] <- 1
  new.df <- subset(new.df, comp == 0)
  new.df <- subset(new.df, select = -c(condition_lag, outcome_lag, comp))
  return(new.df)
} 

你还需要这样调用它(注意你需要使用字符作为输入)

> FLC.Dframe(mwa.df, "Condition1", "Outcome1")

    Case Condition1 Outcome1
1 Case 1          0        0
2 Case 2          1        0
4 Case 4          0        0
5 Case 5          1        1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多