【问题标题】:R : Define a variable as 1, each time a condition is met the first timeR:定义一个变量为1,每次第一次满足一个条件
【发布时间】:2020-12-08 20:05:46
【问题描述】:

尝试为我的数据集设置一个新变量。它应该取值“1”,每次定义组中的其他变量之一第一次取值 0。在其他情况下,例如其他变量第二次、第三次取 0 以此类推或为 1 时,新变量应为 0。

所以它应该看起来像这样:

ID   Var1   Var2  VarNew
1     1      1      0
1     1      1      0
1     0      1      1
1     0      1      0
1     0      0      1
2     1      1      0
2     1      1      0
2     1      1      0
2     0      1      1
2     0      1      0

我尝试编写一个函数并使用ifelse(),但它不起作用。 谁能帮我完成这项任务?提前致谢!

【问题讨论】:

  • 什么是定义的组?这和ID有关吗?

标签: r dataframe if-statement dplyr


【解决方案1】:

这是一种方法。它为每个向量Var* 调用ave,然后将两个结果合并。

new1 <- with(df1, ave(Var1, ID, FUN = function(x) cumsum(x == 0) == 1))
new2 <- with(df1, ave(Var2, ID, FUN = function(x) cumsum(x == 0) == 1))
df1$VarNew2 <- +(new1 + new2 > 0)

identical(df1$VarNew, df1$VarNew2)
#[1] TRUE

最后的清理。

rm(new1, new2)

另一种可能更简单的方法是 sapply ave 到每个 Var* 列。

tmp <- sapply(df1[c('Var1', 'Var2')], function(x){
  ave(x, df1$ID, FUN = function(y) cumsum(y == 0) == 1)
})
df1$VarNew2 <- rowSums(tmp > 0)

但在这种情况下,新列属于"numeric" 类,而"VarNew" 是整数,如str 所示。这会导致identical 返回FALSE。但是all.equal 返回TRUE,因为数值相等。

str(df1)
#'data.frame':  10 obs. of  5 variables:
# $ ID     : int  1 1 1 1 1 2 2 2 2 2
# $ Var1   : int  1 1 0 0 0 1 1 1 0 0
# $ Var2   : int  1 1 1 1 0 1 1 1 1 1
# $ VarNew : int  0 0 1 0 1 0 0 0 1 0
# $ VarNew2: num  0 0 1 0 1 0 0 0 1 0

all.equal(df1$VarNew, df1$VarNew2)
#[1] TRUE

rm(tmp)

数据

df1 <- read.table(text = "
ID   Var1   Var2  VarNew
1     1      1      0
1     1      1      0
1     0      1      1
1     0      1      0
1     0      0      1
2     1      1      0
2     1      1      0
2     1      1      0
2     0      1      1
2     0      1      0
", header = TRUE)

【讨论】:

  • 非常感谢您的回答@rui barrabas。但是,它会返回一个新列,其中包含一行零和不遵循应有模式的零。只是一堆数字。这是否与我在实际数据集中有两列以上的事实有关?
  • @philipp.kn_98 使用发布的数据,此解决方案有效。您可以在失败的地方发布示例数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2016-09-25
  • 2020-11-25
  • 1970-01-01
  • 2019-11-18
  • 2021-12-04
相关资源
最近更新 更多