如何将行聚合到具有三个级别的因子变量?
How do you aggregate rows to a factor variable with three levels?
我有一个数据集,其中一些参与者有多行,我需要以每个参与者只有一行的方式聚合数据。数据集包含不同的变量类型(例如,因子、日期、年龄等)我编写了一个有效的代码,如下所示:
example4 <- SMARTdata_50j_diagc_2016 %>%
group_by( Patient_Id ) %>%
summarise( Groep = first( Groep ),
Ziekenhuis_Nr = first( Ziekenhuis_Nr ),
Ziekenhuistype = first( Ziekenhuistype ),
aantalDBC = n(),
aantalVervolg = sum( as.numeric( Zorgtype_Code ) ),
Leeftijd = mean( Lft_patient_openenDBC ),
MRI_nee_ja = max( ifelse( MRI_nee_ja == 0, 0, 1 ) ),
aantalMRI = sum( MRI_Aantal ),
Artroscopie_nee_ja = max( ifelse( Artroscopie_nee_jaz_jam == 0, 0, 1 ) ),
aantalArtroscopie = sum( Artroscopie_aantal ),
overigDBC = mean( Aantal_overigeDBC_bijopenen ),
DBC_open = min( open_DBC ),
DBC_sluiten = max( sluiten_DBC ) ) %>%
as.data.frame()
这段代码为每个参与者提供了一行。但是,我还有一个变量需要包含在新数据框中,但我不知道该怎么做。我需要添加的变量称为 'Diagnose_Code' 并且是具有两个级别的因子,即 0(代表 1801)和 1(代表 1805)。
对于有多行的参与者(在原始数据框中),有些参与者的变量既有 0 也有 1。现在,在我的新数据框中,我想为 'Diagnose_Code' 创建一个具有三个级别的变量:如果该参与者的所有行都为 0,则为 0,如果该参与者的所有行均为 1,则为 1,如果该参与者的所有行都为 2,则为 2该参与者的行同时具有 0 和 1。
我不知道该怎么做。我在 ifelse 代码上挣扎了一下,但没有成功。有谁知道我如何才能在我的代码中完成这项工作?先感谢您!
使用玩具数据集可以像这样实现:
library(dplyr)
df <- data.frame(
id = rep(1:3, each = 3),
diagnosis_code = c(rep(1,3), rep(0, 3), c(1, 0, 1)),
stringsAsFactors = FALSE
)
df %>%
group_by(id) %>%
summarise(diagnosis_code = case_when(
all(diagnosis_code == 1) ~ 1,
all(diagnosis_code == 0) ~ 0,
TRUE ~ 2
))
#> # A tibble: 3 x 2
#> id diagnosis_code
#> <int> <dbl>
#> 1 1 1
#> 2 2 0
#> 3 3 2
由 reprex package (v0.3.0)
于 2020-03-29 创建
使用 ifelse 应该有效:
df %>%
group_by(id) %>%
summarise(diag=ifelse(max(diag)!=min(diag), 2,
ifelse(max(diag==1), 1, 0)))
# A tibble: 3 x 2
id diag
<dbl> <dbl>
1 1 2
2 2 1
3 3 0
数据:
df <- data.frame(id=c(1,1,1,2,2,2,3,3,3), diag=c(1,0,0,1,1,1,0,0,0))
df %>%
group_by(Patient_Id) %>%
summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3,
sum(Diagnose_Code) == 1 ~ 1,
TRUE ~ 0 ))
我有一个数据集,其中一些参与者有多行,我需要以每个参与者只有一行的方式聚合数据。数据集包含不同的变量类型(例如,因子、日期、年龄等)我编写了一个有效的代码,如下所示:
example4 <- SMARTdata_50j_diagc_2016 %>%
group_by( Patient_Id ) %>%
summarise( Groep = first( Groep ),
Ziekenhuis_Nr = first( Ziekenhuis_Nr ),
Ziekenhuistype = first( Ziekenhuistype ),
aantalDBC = n(),
aantalVervolg = sum( as.numeric( Zorgtype_Code ) ),
Leeftijd = mean( Lft_patient_openenDBC ),
MRI_nee_ja = max( ifelse( MRI_nee_ja == 0, 0, 1 ) ),
aantalMRI = sum( MRI_Aantal ),
Artroscopie_nee_ja = max( ifelse( Artroscopie_nee_jaz_jam == 0, 0, 1 ) ),
aantalArtroscopie = sum( Artroscopie_aantal ),
overigDBC = mean( Aantal_overigeDBC_bijopenen ),
DBC_open = min( open_DBC ),
DBC_sluiten = max( sluiten_DBC ) ) %>%
as.data.frame()
这段代码为每个参与者提供了一行。但是,我还有一个变量需要包含在新数据框中,但我不知道该怎么做。我需要添加的变量称为 'Diagnose_Code' 并且是具有两个级别的因子,即 0(代表 1801)和 1(代表 1805)。
对于有多行的参与者(在原始数据框中),有些参与者的变量既有 0 也有 1。现在,在我的新数据框中,我想为 'Diagnose_Code' 创建一个具有三个级别的变量:如果该参与者的所有行都为 0,则为 0,如果该参与者的所有行均为 1,则为 1,如果该参与者的所有行都为 2,则为 2该参与者的行同时具有 0 和 1。
我不知道该怎么做。我在 ifelse 代码上挣扎了一下,但没有成功。有谁知道我如何才能在我的代码中完成这项工作?先感谢您!
使用玩具数据集可以像这样实现:
library(dplyr)
df <- data.frame(
id = rep(1:3, each = 3),
diagnosis_code = c(rep(1,3), rep(0, 3), c(1, 0, 1)),
stringsAsFactors = FALSE
)
df %>%
group_by(id) %>%
summarise(diagnosis_code = case_when(
all(diagnosis_code == 1) ~ 1,
all(diagnosis_code == 0) ~ 0,
TRUE ~ 2
))
#> # A tibble: 3 x 2
#> id diagnosis_code
#> <int> <dbl>
#> 1 1 1
#> 2 2 0
#> 3 3 2
由 reprex package (v0.3.0)
于 2020-03-29 创建使用 ifelse 应该有效:
df %>%
group_by(id) %>%
summarise(diag=ifelse(max(diag)!=min(diag), 2,
ifelse(max(diag==1), 1, 0)))
# A tibble: 3 x 2
id diag
<dbl> <dbl>
1 1 2
2 2 1
3 3 0
数据:
df <- data.frame(id=c(1,1,1,2,2,2,3,3,3), diag=c(1,0,0,1,1,1,0,0,0))
df %>%
group_by(Patient_Id) %>%
summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3,
sum(Diagnose_Code) == 1 ~ 1,
TRUE ~ 0 ))