Как объединить несколько столбцов фрейма данных в R - PullRequest
2 голосов
/ 21 октября 2019

У меня есть файл .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 ]

3 голосов
/ 21 октября 2019

Это более или менее похоже на наш подход с аналогичными данными из 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 голос
/ 21 октября 2019

Вот еще один подход, использующий 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 
0 голосов
/ 22 октября 2019

Вот базовый подход:

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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...