R 如何根据其他变量中的值为每个个体创建二进制变量?

R 如何根据其他变量中的值为每个个体创建二进制变量?,r,dplyr,tidyverse,feature-engineering,R,Dplyr,Tidyverse,Feature Engineering,所以我有一个包含4个人的数据集。每个个体在不同的时间段进行测量。在R中: df = data.frame(cbind("id"=c(1,1,1,2,2,3,3,3,3,4,4), "t"=c(1,2,3,1,2,1,2,3,4,1,2), "x1"=c(0,1,0,1,0,0,1,0,1,0,0))) 我想创建变量x2,指示给定个体的变量x1中是否已经有1,即如下所示: "x2" = c(0,1,1,1,1,0,1

所以我有一个包含4个人的数据集。每个个体在不同的时间段进行测量。在R中:

df = data.frame(cbind("id"=c(1,1,1,2,2,3,3,3,3,4,4), "t"=c(1,2,3,1,2,1,2,3,4,1,2), "x1"=c(0,1,0,1,0,0,1,0,1,0,0)))
我想创建变量x2,指示给定个体的变量x1中是否已经有1,即如下所示:

"x2" = c(0,1,1,1,1,0,1,1,1,0,0)
。。。理想情况下使用dplyr包。到目前为止,我来到这里:

new_df = df %>% dplyr::group_by(id) %>% dplyr::arrange(t) 
但不能从这一点出发。。。理想的结果如图所示


以下是一种使用dplyr的方法:

df %>% 
  arrange(id, t) %>%
  group_by(id) %>% 
  mutate(x2 = ifelse(row_number() >= min(row_number()[x1 == 1]), 1, 0))
如果行号大于或等于第一行号,其中
x1
为1,则这将添加1;否则,它将添加一个0

注意,您将收到警告,因为至少有一个组的值
x1
不等于1

另外,另一个备选方案,包括如果您想要
NA
,其中no
id
x1
值为1(例如,
id
为4):

输出

      id     t    x1    x2
   <dbl> <dbl> <dbl> <dbl>
 1     1     1     0     0
 2     1     2     1     1
 3     1     3     0     1
 4     2     1     1     1
 5     2     2     0     1
 6     3     1     0     0
 7     3     2     1     1
 8     3     3     0     1
 9     3     4     1     1
10     4     1     0     0
11     4     2     0     0
id t x1 x2
1     1     1     0     0
2     1     2     1     1
3     1     3     0     1
4     2     1     1     1
5     2     2     0     1
6     3     1     0     0
7     3     2     1     1
8     3     3     0     1
9     3     4     1     1
10     4     1     0     0
11     4     2     0     0

谢谢。同时我提出了这个解决方案:新的df=df%>%dplyr::arrange(id,t)%>%dplyr::groupby(id)%>%dplyr::mutate(“x2”=ifelse(cumsum(x1)>0,1,0))。。。但我担心在出现问题时可能会出现一些特殊情况。你觉得怎么样?@pikachu,应该行得通。我使用另一个选项进行编辑,如果
x1
的值不等于1,则添加
NA
,以防万一。
      id     t    x1    x2
   <dbl> <dbl> <dbl> <dbl>
 1     1     1     0     0
 2     1     2     1     1
 3     1     3     0     1
 4     2     1     1     1
 5     2     2     0     1
 6     3     1     0     0
 7     3     2     1     1
 8     3     3     0     1
 9     3     4     1     1
10     4     1     0     0
11     4     2     0     0