我有一个.csv文件,其中包含我的参与者的受众特征数据。数据被编码并从我的研究数据库(REDCap)中下载,每种种族都有自己单独的列。也就是说,每个参与者在这些列的每一个中都有一个值(如果认可,则为1;如果未认可,则为0)。
它看起来像这样:
SubjID Sex Age White AA Asian Other
001 F 62 0 1 0 0
002 M 66 1 0 0 0
这很烦人,我必须使用环形交叉路口来获取人口统计摘要统计信息。有一种更简单的方法可以做到这一点。我的问题是,如何将这些列合并为一列,以便每个参与者只有一个种族值(即重新编码,因此1 =白色,2 = AA等,并且仅为每个参与者提取认可的类别)并添加到此列)?
这就是我想要的样子:
SubjID Sex Age Race
001 F 62 2
002 M 66 1
谢谢。
答案 0 :(得分:3)
这与REDCap的类似数据或多或少相似。我们将pivot_longer
用于伪变量。最后的Race
变量也可以作为一个因素。请告诉我您是否有这种想法。
library(tidyverse)
df <- data.frame(
SubjID = c("001", "002"),
Sex = c("F", "M"),
Age = c(62, 66),
White = c(0, 1),
AA = c(1, 0),
Asian = c(0, 0),
Other = c(0, 0)
)
df %>%
pivot_longer(cols = c("White", "AA", "Asian", "Other"), names_to = "Race", values_to = "Value") %>%
filter(Value == 1) %>%
select(-Value) %>%
mutate(Race = as.factor(Race))
结果:
# A tibble: 2 x 4
SubjID Sex Age Race
<fct> <fct> <dbl> <fct>
1 001 F 62 AA
2 002 M 66 White
答案 1 :(得分:1)
这是使用reshape2
df[df == 0] <- NA
df <- reshape2::melt(df, measure.vars = c("White", "AA", "Asian", "Other"), variable.name = "Race", na.rm = TRUE)
df <- subset(df, select = -value)
# SubjID Sex Age Race
# 002 M 66 White
# 001 F 62 AA
答案 2 :(得分:0)
这是一种基本方法:
race_cols <- 4:7
ind <- max.col(df[, race_cols])
df$Race_number <- ind
df$Race <- names(df[, race_cols])[ind]
df[, -race_cols]
SubjID Sex Age Race_number Race
1 001 F 62 2 AA
2 002 M 66 1 White
@Ben中的数据
df <- data.frame(
SubjID = c("001", "002"),
Sex = c("F", "M"),
Age = c(62, 66),
White = c(0, 1),
AA = c(1, 0),
Asian = c(0, 0),
Other = c(0, 0)
)