我一直在努力学习根据一个名称与多个种族关联的条件对列中的变量进行重新编码的最佳方法。
我一直在使用这样的数据帧:
df <- data.frame('Name' = c("Jon", "Jon", "Bobby", "Sarah", "Fred"),
'Race' = c("Black", "White", "Asian", "Asian", "Black"))
我试图做的是对组中多次出现的任何值进行重新编码,并将其转换为"0";"多种族";类别
最终目标是构建如下数据帧:
df1 <- data.frame('Name' = c("Jon", "Bobby", "Sarah", "Fred"),
'Race' = c("Multiracial", "Asian", "Asian", "Black"))
我目前的做法是,列出一份有多个答案的人的名单,按名字对种族进行分组。然后,得到一个包含多个答案的名字的列表,对于仅包含多个回答的名字,将种族替换为"种族";"多种族";。代码如下:
df1 <- unique(df[, c('Name', 'Race')])
multi_answer <-
df1 %>%
dplyr::group_by(Name) %>%
dplyr::summarise(n_answers = n_distinct(Race))
multi_answer <- multi_answer[multi_answer$n_answers >1,]
df1[df1$Name %in% c(multi_answer$Name), 'Race'] <- 'multi-racial'
df1 <- unique(df1)
您可以只group_by
、Name
,然后summarize
数据。你只需要使用";如果存在多于一个条目";(即n() > 1
(:
library(tidyverse)
df |>
group_by(Name)|>
summarise(Race = ifelse(n() > 1, "multi-racial", Race))
#> # A tibble: 4 x 2
#> Name Race
#> <chr> <chr>
#> 1 Bobby Asian
#> 2 Fred Black
#> 3 Jon multi-racial
#> 4 Sarah Asian