![](/img/trans.png)
[英]How to locate Excel table I've created in RStudio with `writexl` package?
[英]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.