簡體   English   中英

我創建了一個基於模式的變量。 我如何對我標記的那個模式的出現進行排名?

[英]I've created a variable based on a pattern. How can I rank the occurrence of that pattern that I've flagged?

在下面的模擬數據集中,我創建了“nonres_flag”作為每次一個人成為非居民的指標(即“res”從“1”變為“0”)。

現在我需要為“nonres_flag”創建一個排名變量(“rank_nonres_flag”)。 這個新列“rank_nonres_flag”應該提供 nonres_flag 出現的排名。 我需要知道這是他們第一次成為非居民,還是第二次,還是第n次。

例如,person 3 有兩個 nonres_flag 實例。 第一次人 3 有一個 nonres_flag=1,我需要 rank_nonres_flag 在前兩個時間段等於'1',當人 3 在'res' = 1 之后有'res' = 0。這將表明這是第一個那個人 3 有一個“res”=0 的時間。

類似地,對於人 3 第二次具有 nonres_flag=1,我需要 rank_nonres_flag='2' 用於人 3 在 'res'=1 之后具有 'res'=0 的第二個時間段(它只是一個時間段)。

該解決方案需要適用於每人無限數量的 nonres_flag 實例。

謝謝你的幫助!

#Load packages
library(Hmisc)
library(dplyr)
library(tidyr)

#Create data set
person <- c(1, 1, 1, 2, 3, 3, 3, 3, 3, 3)
time <- c(1, 2, 3, 1, 1, 2, 3, 4, 5, 6)
res <- c(1, 0, 1, 1, 1, 0, 0, 1, 0, 1)

#Populate data frame
d <- cbind(person, time, res)
d <- as.data.frame(d)

d %>% 
#Data are longitudinal, so I'll group by person
  group_by(person) %>% 
#First, I create an indicator variable to mark each time a person changes from 'res'=1 to 'res'=0
  mutate(nonres_flag = if_else(Lag(res) == 1 & res == 0, 1, 0, 0)) %>%
#Second, here is where I need help ranking each time this change happens within a person
  mutate(rank_nonres_flag = rank(nonres_flag)) 
#> # A tibble: 10 x 5
#> # Groups:   person [3]
#>    person  time   res nonres_flag rank_nonres_flag
#>     <dbl> <dbl> <dbl>       <dbl>            <dbl>
#>  1      1     1     1           0              1.5
#>  2      1     2     0           1              3  
#>  3      1     3     1           0              1.5
#>  4      2     1     1           0              1  
#>  5      3     1     1           0              2.5
#>  6      3     2     0           1              5.5
#>  7      3     3     0           0              2.5
#>  8      3     4     1           0              2.5
#>  9      3     5     0           1              5.5
#> 10      3     6     1           0              2.5

代表 package (v2.0.0) 於 2021 年 4 月 24 日創建

已解決,借用@RonakShah 的想法來使用 cumsum() function。 我在 if_else() 中使用它來為 res=0 的每個值提供標志變量的累積和。 這特別有效,因為基於標志的邏輯確保如果沒有標志,則不會為 'res'=0 分配 cumsum() (表明它是一個非駐留時間段,之前有一個 res= 1個時間段),謝謝大家!

#Load packages
library(Hmisc)
#> Loading required package: lattice
#> Loading required package: survival
#> Loading required package: Formula
#> Loading required package: ggplot2
#> 
#> Attaching package: 'Hmisc'
#> The following objects are masked from 'package:base':
#> 
#>     format.pval, units
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:Hmisc':
#> 
#>     src, summarize
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)

#Create data set
person <- c(1, 1, 1, 2, 3, 3, 3, 3, 3, 3)
time <- c(1, 2, 3, 1, 1, 2, 3, 4, 5, 6)
res <- c(1, 0, 1, 1, 1, 0, 0, 1, 0, 1)

#Populate data frame
d <- cbind(person, time, res)
d <- as.data.frame(d)

d %>% 
  group_by(person) %>% 
  mutate(nonres_flag = if_else(Lag(res) == 1 & res == 0, 1, 0, 0)) %>%
  mutate(rank_nonres_flag = if_else(res == 0, cumsum(nonres_flag), 0, 0))
#> # A tibble: 10 x 5
#> # Groups:   person [3]
#>    person  time   res nonres_flag rank_nonres_flag
#>     <dbl> <dbl> <dbl>       <dbl>            <dbl>
#>  1      1     1     1           0                0
#>  2      1     2     0           1                1
#>  3      1     3     1           0                0
#>  4      2     1     1           0                0
#>  5      3     1     1           0                0
#>  6      3     2     0           1                1
#>  7      3     3     0           0                1
#>  8      3     4     1           0                0
#>  9      3     5     0           1                2
#> 10      3     6     1           0                0

代表 package (v2.0.0) 於 2021 年 4 月 25 日創建

你在找這個嗎?

library(dplyr)

d %>%
  group_by(person) %>% 
  mutate(nonres_flag = as.integer(lag(res) == 1 & res == 0), 
         rank_nonres_flag = cumsum(nonres_flag)) %>%
  ungroup

#   person  time   res nonres_flag rank_nonres_flag
#    <dbl> <dbl> <dbl>       <int>            <int>
# 1      1     1     1           0                0
# 2      1     2     0           1                1
# 3      1     3     1           0                1
# 4      2     1     1           0                0
# 5      3     1     1           0                0
# 6      3     2     0           1                1
# 7      3     3     0           0                1
# 8      3     4     1           0                1
# 9      3     5     0           1                2
#10      3     6     1           0                2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM