如何解决R:每次第一次满足条件时,将变量定义为1
尝试为我的数据集设置一个新变量。每次定义的组中的其他变量之一首次取值0时,它就应该取值“ 1”。在其他情况下,例如其他变量第二次,第三次取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()
,但是没有用。
有人可以帮我完成这项任务吗?预先感谢!
解决方法
这是一种方法。它为每个向量ave
调用Var*
,然后将两个结果合并。
new1 <- with(df1,ave(Var1,ID,FUN = function(x) cumsum(x == 0) == 1))
new2 <- with(df1,ave(Var2,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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。