根据另一列的先前观察值创建新变量
Create new variable based on prior observation value from another column
我正在构建一个新变量,其值取决于另一列中的前一行。因此,数据的顺序很重要。这是我的数据目前的样子
ID Cong Comm Y
1 52 3 0
1 53 3 0
1 54 3 1
1 53 4 1
2 50 2 1
2 50 7 1
3 48 4 1
4 48 3 1
4 48 7 0
4 49 7 1
我想创建一个名为 Y2 的新变量。如果观察的 Y=0,则同一观察中的 Y2 应等于 1。如果下一行的 Y=0,则将 1 加到前一个 Y2 值(此观察的 Y2 值应等于 2)。继续这个过程直到Y=1,加1,然后停止这个过程。本质上,新变量会一直计数,直到另一列的值等于“1”,然后重复该过程。
它应该是这样的:
ID Cong Comm Y Y2
1 52 3 0 1
1 53 3 0 2
1 54 3 1 3
1 53 4 1 1
2 50 2 1 1
2 50 7 1 1
3 48 4 1 1
4 48 3 1 1
4 48 7 0 1
4 49 7 1 2
这是我的示例数据框。
data.frame(
ID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L),
Cong = c(52L, 53L, 54L, 53L, 50L, 50L, 48L, 48L, 48L, 49L),
Comm = c(3L, 3L, 3L, 4L, 2L, 7L, 4L, 3L, 7L, 7L),
Y=c(0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L))
循环或 if-else 命令是解决此问题的最佳方法吗?我尝试了 if-else 语句,但我的代码不起作用。任何建议都会很棒。
你可以这样做,假设你的 data.frame 是 df
:
y = df$Y
bool=y==c(0, head(y, -1))
y[which(bool %in% F)] = 0
df$Y2 = ifelse(y==0, f7(!y), 1)
# ID Cong Comm Y Y2
#1 1 52 3 0 1
#2 1 53 3 0 2
#3 1 54 3 1 3
#4 1 53 4 1 1
#5 2 50 2 1 1
#6 2 50 7 1 1
#7 3 48 4 1 1
#8 4 48 3 1 1
#9 4 48 7 0 1
#10 4 49 7 1 2
技巧已完成:
f7 <- function(x){ tmp<-cumsum(x);tmp-cummax((!x)*tmp)}
完全定义在这个伟大的 post:
count how many consecutive values are true
最后这个解决方案是完全矢量化的,没有循环。
我正在构建一个新变量,其值取决于另一列中的前一行。因此,数据的顺序很重要。这是我的数据目前的样子
ID Cong Comm Y
1 52 3 0
1 53 3 0
1 54 3 1
1 53 4 1
2 50 2 1
2 50 7 1
3 48 4 1
4 48 3 1
4 48 7 0
4 49 7 1
我想创建一个名为 Y2 的新变量。如果观察的 Y=0,则同一观察中的 Y2 应等于 1。如果下一行的 Y=0,则将 1 加到前一个 Y2 值(此观察的 Y2 值应等于 2)。继续这个过程直到Y=1,加1,然后停止这个过程。本质上,新变量会一直计数,直到另一列的值等于“1”,然后重复该过程。
它应该是这样的:
ID Cong Comm Y Y2
1 52 3 0 1
1 53 3 0 2
1 54 3 1 3
1 53 4 1 1
2 50 2 1 1
2 50 7 1 1
3 48 4 1 1
4 48 3 1 1
4 48 7 0 1
4 49 7 1 2
这是我的示例数据框。
data.frame(
ID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L),
Cong = c(52L, 53L, 54L, 53L, 50L, 50L, 48L, 48L, 48L, 49L),
Comm = c(3L, 3L, 3L, 4L, 2L, 7L, 4L, 3L, 7L, 7L),
Y=c(0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L))
循环或 if-else 命令是解决此问题的最佳方法吗?我尝试了 if-else 语句,但我的代码不起作用。任何建议都会很棒。
你可以这样做,假设你的 data.frame 是 df
:
y = df$Y
bool=y==c(0, head(y, -1))
y[which(bool %in% F)] = 0
df$Y2 = ifelse(y==0, f7(!y), 1)
# ID Cong Comm Y Y2
#1 1 52 3 0 1
#2 1 53 3 0 2
#3 1 54 3 1 3
#4 1 53 4 1 1
#5 2 50 2 1 1
#6 2 50 7 1 1
#7 3 48 4 1 1
#8 4 48 3 1 1
#9 4 48 7 0 1
#10 4 49 7 1 2
技巧已完成:
f7 <- function(x){ tmp<-cumsum(x);tmp-cummax((!x)*tmp)}
完全定义在这个伟大的 post:
count how many consecutive values are true
最后这个解决方案是完全矢量化的,没有循环。