[英]How to combine multiple data frame columns in R
I have a.csv file with demographic data for my participants.我有一个 .csv 文件,其中包含我的参与者的人口统计数据。 The data are coded and downloaded from my study database (REDCap) in a way that each race has its own separate column.这些数据是从我的研究数据库 (REDCap) 中编码和下载的,每个种族都有自己的单独列。 That is, each participant has a value in each of these columns (1 if endorsed, 0 if unendorsed).也就是说,每个参与者在这些列的每一列中都有一个值(如果被认可,则为 1,如果未认可,则为 0)。
It looks something like this:它看起来像这样:
SubjID Sex Age White AA Asian Other
001 F 62 0 1 0 0
002 M 66 1 0 0 0
I have to use a roundabout way to get my demographic summary stats.我必须使用迂回的方式来获取我的人口统计摘要统计信息。 There's gotta be a simpler way to do this.必须有一种更简单的方法来做到这一点。 My question is, how can I combine these columns into one column so that there is only one value for race for each participant?我的问题是,如何将这些列合并为一列,以便每个参与者只有一个种族值? (ie recoding so 1 = white, 2 = AA, etc, and only the endorsed category is being pulled for each participant and added to this column?) (即重新编码,因此 1 = 白色、2 = AA 等,并且只有为每个参与者提取认可的类别并添加到此列?)
This is what I would like for it to look:这就是我希望它看起来的样子:
SubjID Sex Age Race
001 F 62 2
002 M 66 1
This is more or less similar to our approach with similar data from REDCap.这或多或少类似于我们使用来自 REDCap 的类似数据的方法。 We use pivot_longer
for dummy variables.我们将pivot_longer
用于虚拟变量。 The final Race
variable could also be made a factor.最后的Race
变量也可以作为一个因素。 Please let me know if this is what you had in mind.如果这是您的想法,请告诉我。
Edit: Added names_ptypes
to pivot_longer
to indicate that Race
variable is a factor (instead of mutate
).编辑:将names_ptypes
添加到pivot_longer
以表明Race
变量是一个因素(而不是mutate
)。
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", names_ptypes = list(Race = factor()), values_to = "Value") %>%
filter(Value == 1) %>%
select(-Value)
Result:结果:
# A tibble: 2 x 4
SubjID Sex Age Race
<fct> <fct> <dbl> <fct>
1 001 F 62 AA
2 002 M 66 White
Here is another approach using reshape2
这是使用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
Here's a base approach:这是一个基本方法:
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
Data from @Ben来自@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)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.