Создать новый набор столбцов из двух существующих наборов столбцов на основе значения фактора - PullRequest
0 голосов
/ 21 мая 2018

У меня есть переменные с именами "VA01_01", "VA01_02" и т. Д. И "VA02_01", "VA02_02".Эти переменные с префиксом VA01 - это данные участников женского пола, а переменные с префиксом VA02 - участников мужского пола.Например, участники мужского пола имеют NA в переменных VA01.У меня уже есть фактор со значениями для пола.

Что я хотел бы сделать, это создать новый набор переменных, которые принимают значения обоих типов переменных.То есть, если это участник мужского пола, он получает значения переменных VA02 в этом наборе переменных.Таким образом, новый набор переменных больше не будет иметь NA, потому что он не будет основан на поле.

У кого-нибудь есть простое решение для этого вопроса?Я не знаю, является ли изменение формы ответом, потому что я действительно не хочу преобразовывать свой фрейм данных в длинный формат.

Вот как это выглядит в начале:

 structure(list(sex = structure(c(1L, 2L, 1L, 2L), .Label = c("female", 
 "male"), class = "factor"), VA01_01 = c(1, NA, 2, NA), VA01_02 = c(4, 
 NA, 4, NA), VA02_01 = c(NA, 3, NA, 4), VA02_02 = c(NA, 5, NA, 
 3)), .Names = c("sex", "VA01_01", "VA01_02", "VA02_01", "VA02_02"
 ), row.names = c(NA, -4L), class = "data.frame")

И вот в конце (я хотел бы сохранить исходные переменные):

structure(list(sex = structure(c(1L, 2L, 1L, 2L), .Label = c("female", 
"male"), class = "factor"), VA_tot_01 = c(1, 3, 2, 4), VA_tot_02 = c(4, 
5, 4, 3), VA01_01 = c(1, NA, 2, NA), VA01_02 = c(4, NA, 4, NA
), VA02_01 = c(NA, 3, NA, 4), VA02_02 = c(NA, 5, NA, 3)), .Names = c("sex", 
"VA_tot_01", "VA_tot_02", "VA01_01", "VA01_02", "VA02_01", "VA02_02"
), row.names = c(NA, -4L), class = "data.frame")

1 Ответ

0 голосов
/ 21 мая 2018

Учитывая, что VAR01 и VAR02 не перекрываются, вы можете просто создать еще одну переменную VAR_tot_xx, включая исходные значения из обоих.Это может быть что-то вроде этого:

new_vars <- function(df) {
  vars <- unique(gsub(
    pattern = ".*_", 
    replacement = "_", 
    x = grep(
      pattern = "_[0-9]{2}$", 
      x = names(df), 
      value = TRUE
    )
  ))
  for (i in vars) {
    new_name <- paste0("VA_tot", i)
    male_name <- paste0("VA01", i)
    female_name <- paste0("VA02", i)
    df[[new_name]] <- NA
    df[[new_name]][!is.na(df[[female_name]])] <- 
      df[[female_name]][!is.na(df[[female_name]])]
    df[[new_name]][!is.na(df[[male_name]])] <- 
      df[[male_name]][!is.na(df[[male_name]])]
  }
  return(df)
}

Возможно, это может быть красивее, но это делает работу.

c <- structure(
  list(
    sex = structure(
      c(1L, 2L, 1L, 2L),
      .Label = c("female", "male"),
      class = "factor"
    ),
    VA01_01 = c(1, NA, 2, NA),
    VA01_02 = c(4, NA, 4, NA),
    VA02_01 = c(NA, 3, NA, 4),
    VA02_02 = c(NA, 5, NA, 3)
  ),
  .Names = c("sex", "VA01_01", "VA01_02", "VA02_01", "VA02_02"),
  row.names = c(NA, -4L),
  class = "data.frame"
)
new_vars(c)

#       sex VA01_01 VA01_02 VA02_01 VA02_02 VA_tot_01 VA_tot_02
# 1 female        1       4      NA      NA         1         4
# 2   male       NA      NA       3       5         3         5
# 3 female        2       4      NA      NA         2         4
# 4   male       NA      NA       4       3         4         3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...