根据唯一列项目的计数创建一个 3 级指标变量
Create a 3-level indicator variable based on counts of unique column items
背景
我有一个数据框df
:
df <- data.frame(ID = c("a","a","a","b","b","b", "c","c","c","c","c","d","d","d","d"),
event = c("red",NA,"blue","white",NA,"white","orange",NA,"gray",NA,"red","black","magenta","purple","brown"),
stringsAsFactors=FALSE)
> df
ID event
1 a red
2 a <NA>
3 a blue
4 b white
5 b <NA>
6 b white
7 c orange
8 c <NA>
9 c gray
10 c <NA>
11 c red
12 d black
13 d magenta
14 d purple
15 d brown
其中有 4 个人 (ID
),共 15 行,每个人都有各种 event
条目,这些条目在该人中是唯一的:例如 ID=a 有 2 个唯一事件,红色和蓝色,而 ID=b 只有 1 个唯一事件,白色,即使有 2 个“白色”。
问题
我想创建一个新列,indicator
,计算每个 ID 中唯一的非 NA 事件的数量,并将它们分类到不同的级别:
- 0 如果那个人只有一个独特的非 NA
event
- 1 代表 2 个独特的非 NA
event
s
- 2 表示 3 个或更多独特的非 NA
event
s
级别指示器应应用于每个 ID
的 indicator
的每一行,包括 event=NA 行——它不能只是 indicator
= 2,因为例如,当 event
.
中有非 NA 的东西时
换句话说,我正在寻找这样的东西:
# A tibble: 15 x 3
ID event indicator
<chr> <chr> <int>
1 a red 1
2 a NA 1
3 a blue 1
4 b white 0
5 b NA 0
6 b white 0
7 c orange 2
8 c NA 2
9 c gray 2
10 c NA 2
11 c red 2
12 d black 2
13 d magenta 2
14 d purple 2
15 d brown 2
我试过的
我一开始只是尝试构建中间层,看看我是否可以获得等于 1 的 ID=a,但这样做是为了 ID=b 而不是:
df <- df %>%
group_by(ID) %>%
mutate(indicator = if_else((n_distinct(event)) == 2, 1, 0)) %>%
ungroup()
# A tibble: 15 x 3
ID event indicator
<chr> <chr> <dbl>
1 a red 0
2 a NA 0
3 a blue 0
4 b white 1
5 b NA 1
6 b white 1
7 c orange 0
8 c NA 0
9 c gray 0
10 c NA 0
11 c red 0
12 d black 0
13 d magenta 0
14 d purple 0
15 d brown 0
为什么它认为“白色”的 2 个实例是 2 个不同的事件?还是 n_distinct
不是我想的那样?
与 data.table
和 fcase
:
library(data.table)
setDT(df)
df[,indicator:=fcase(sum(!is.na(unique(event)))<=1,0,sum(!is.na(unique(event)))==2,1,default=2),by=ID][]
ID event indicator
1: a red 1
2: a <NA> 1
3: a blue 1
4: b white 0
5: b <NA> 0
6: b white 0
7: c orange 2
8: c <NA> 2
9: c gray 2
10: c <NA> 2
11: c red 2
12: d black 2
13: d magenta 2
14: d purple 2
15: d brown 2
您可以使用:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(x = pmax(pmin(n_distinct(event, na.rm = TRUE), 3) - 1, 0)) %>%
ungroup()
# A tibble: 15 × 3
ID event x
<chr> <chr> <dbl>
1 a red 1
2 a NA 1
3 a blue 1
4 b white 0
5 b NA 0
6 b white 0
7 c orange 2
8 c NA 2
9 c gray 2
10 c NA 2
11 c red 2
12 d black 2
13 d magenta 2
14 d purple 2
15 d brown 2
如果您确信没有任何组仅由 NA
组成,则可以删除 pmax()
。要回答您的问题,您需要告诉 n_distinct()
省略 NA
个值,否则它们将被计算在内。
另一个可能的解决方案:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(indicator = n_distinct(event, na.rm = T) %>%
{case_when(. == 1 ~ 0, . == 2 ~ 1, . >= 3 ~ 2)}) %>% ungroup
#> # A tibble: 15 × 3
#> ID event indicator
#> <chr> <chr> <dbl>
#> 1 a red 1
#> 2 a <NA> 1
#> 3 a blue 1
#> 4 b white 0
#> 5 b <NA> 0
#> 6 b white 0
#> 7 c orange 2
#> 8 c <NA> 2
#> 9 c gray 2
#> 10 c <NA> 2
#> 11 c red 2
#> 12 d black 2
#> 13 d magenta 2
#> 14 d purple 2
#> 15 d brown 2
背景
我有一个数据框df
:
df <- data.frame(ID = c("a","a","a","b","b","b", "c","c","c","c","c","d","d","d","d"),
event = c("red",NA,"blue","white",NA,"white","orange",NA,"gray",NA,"red","black","magenta","purple","brown"),
stringsAsFactors=FALSE)
> df
ID event
1 a red
2 a <NA>
3 a blue
4 b white
5 b <NA>
6 b white
7 c orange
8 c <NA>
9 c gray
10 c <NA>
11 c red
12 d black
13 d magenta
14 d purple
15 d brown
其中有 4 个人 (ID
),共 15 行,每个人都有各种 event
条目,这些条目在该人中是唯一的:例如 ID=a 有 2 个唯一事件,红色和蓝色,而 ID=b 只有 1 个唯一事件,白色,即使有 2 个“白色”。
问题
我想创建一个新列,indicator
,计算每个 ID 中唯一的非 NA 事件的数量,并将它们分类到不同的级别:
- 0 如果那个人只有一个独特的非 NA
event
- 1 代表 2 个独特的非 NA
event
s - 2 表示 3 个或更多独特的非 NA
event
s
级别指示器应应用于每个 ID
的 indicator
的每一行,包括 event=NA 行——它不能只是 indicator
= 2,因为例如,当 event
.
换句话说,我正在寻找这样的东西:
# A tibble: 15 x 3
ID event indicator
<chr> <chr> <int>
1 a red 1
2 a NA 1
3 a blue 1
4 b white 0
5 b NA 0
6 b white 0
7 c orange 2
8 c NA 2
9 c gray 2
10 c NA 2
11 c red 2
12 d black 2
13 d magenta 2
14 d purple 2
15 d brown 2
我试过的
我一开始只是尝试构建中间层,看看我是否可以获得等于 1 的 ID=a,但这样做是为了 ID=b 而不是:
df <- df %>%
group_by(ID) %>%
mutate(indicator = if_else((n_distinct(event)) == 2, 1, 0)) %>%
ungroup()
# A tibble: 15 x 3
ID event indicator
<chr> <chr> <dbl>
1 a red 0
2 a NA 0
3 a blue 0
4 b white 1
5 b NA 1
6 b white 1
7 c orange 0
8 c NA 0
9 c gray 0
10 c NA 0
11 c red 0
12 d black 0
13 d magenta 0
14 d purple 0
15 d brown 0
为什么它认为“白色”的 2 个实例是 2 个不同的事件?还是 n_distinct
不是我想的那样?
与 data.table
和 fcase
:
library(data.table)
setDT(df)
df[,indicator:=fcase(sum(!is.na(unique(event)))<=1,0,sum(!is.na(unique(event)))==2,1,default=2),by=ID][]
ID event indicator
1: a red 1
2: a <NA> 1
3: a blue 1
4: b white 0
5: b <NA> 0
6: b white 0
7: c orange 2
8: c <NA> 2
9: c gray 2
10: c <NA> 2
11: c red 2
12: d black 2
13: d magenta 2
14: d purple 2
15: d brown 2
您可以使用:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(x = pmax(pmin(n_distinct(event, na.rm = TRUE), 3) - 1, 0)) %>%
ungroup()
# A tibble: 15 × 3
ID event x
<chr> <chr> <dbl>
1 a red 1
2 a NA 1
3 a blue 1
4 b white 0
5 b NA 0
6 b white 0
7 c orange 2
8 c NA 2
9 c gray 2
10 c NA 2
11 c red 2
12 d black 2
13 d magenta 2
14 d purple 2
15 d brown 2
如果您确信没有任何组仅由 NA
组成,则可以删除 pmax()
。要回答您的问题,您需要告诉 n_distinct()
省略 NA
个值,否则它们将被计算在内。
另一个可能的解决方案:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(indicator = n_distinct(event, na.rm = T) %>%
{case_when(. == 1 ~ 0, . == 2 ~ 1, . >= 3 ~ 2)}) %>% ungroup
#> # A tibble: 15 × 3
#> ID event indicator
#> <chr> <chr> <dbl>
#> 1 a red 1
#> 2 a <NA> 1
#> 3 a blue 1
#> 4 b white 0
#> 5 b <NA> 0
#> 6 b white 0
#> 7 c orange 2
#> 8 c <NA> 2
#> 9 c gray 2
#> 10 c <NA> 2
#> 11 c red 2
#> 12 d black 2
#> 13 d magenta 2
#> 14 d purple 2
#> 15 d brown 2