如何在R中合并多个数据框列

时间:2019-10-21 18:52:33

标签: r dataframe concatenation

我有一个.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

谢谢。

3 个答案:

答案 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)
)