R - Объединить два столбца в одном кадре данных, создать новый заголовок столбца, повторить большой набор данных, используя lapply и объединить - PullRequest
0 голосов
/ 11 мая 2018

Я начинающий пользователь R, и у меня есть большой фрейм данных (1700 столбцов), который организован по столбцам данных и флагов:

df <- data.frame( "100249 MERCURY TOTAL ug/L" = runif(10),
              "100397 TRIHALOMETHANES ug/L" = runif(10),
              "100397 TRIHALOMETHANES ug/L FLAG" = c("L", "L", NA, "L", "L", NA, "L", NA, NA, NA),
              "100407 XYLENE ug/L" = runif(10),
              "100407 XYLENE ug/L FLAG" = c("L", NA, "L", "L", "L", NA, "L", NA, "L", "L"), 
              check.names=FALSE ) 

Нет данных для данных, не каждый параметр имеетсвязанный столбец FLAG.

Я хотел бы объединить совпадающие данные и флаги вместе, сначала с флагом, а затем с числовыми данными в каждой ячейке, и переименовать объединенные столбцы в «100397 TRIHALOMETHANES ug / _COMB» и повторить длякаждая пара столбцов данных и флагов.

Пока у меня есть возможность искать столбцы FLAG с помощью grepl, создавать новый заголовок с помощью gsub и paste0, но функции lapply и merge для объединения столбцов не являютсяработает на меня.Я также читал, что люди используют «вставить» или «объединить» Tidyr для объединения столбцов, но пока ничего не удалось.

Пример моего кода:

lapply(df, function(x) if (grepl("*\\FLAG$", colnames(df(x)))) {


  newcol = paste0("df$", gsub("*\\FLAG$", "", colnames(df(x))), "_COMB")
  assign(newcol, merge(df[x], df[x-1], all= T))

})

Буду признателен за любой совет, спасибо.

1 Ответ

0 голосов
/ 11 мая 2018
Reduce(f = function(dat, col) {
  x <- sub(" ?FLAG$", "", col)
  if (!x %in% names(dat)) return(dat)
  dat[paste0(x, "_COMB")] <- paste(dat[[col]], dat[[x]])
  dat[c(col, x)] <- NULL
  dat
}, x = grep("FLAG$", names(df), value = TRUE), init = df)

#    100249 MERCURY TOTAL ug/L 100397 TRIHALOMETHANES ug/L_COMB 100407 XYLENE ug/L_COMB
# 1                 0.04353999              L 0.375519647961482      L 0.95818781433627
# 2                 0.49308933              L 0.931443430483341    NA 0.744603316066787
# 3                 0.68270299             NA 0.409499574452639     L 0.993966163368896
# 4                 0.26546071             L 0.0351015995256603     L 0.696171462768689
# 5                 0.95956891              L 0.603019695729017     L 0.709421107778326
# 6                 0.01842927              NA 0.96781362616457    NA 0.201458259951323
# 7                 0.12114176              L 0.734256325522438     L 0.457969205919653
# 8                 0.93771709             NA 0.309347201371565    NA 0.508297981694341
# 9                 0.47122685             NA 0.822285959031433      L 0.87013426842168
# 10                0.11501974              NA 0.56137450854294     L 0.153437153436244

Или:

dat <- df
for (col in grep("FLAG$", names(df), value = TRUE)) {
  x <- sub(" ?FLAG$", "", col)
  if (!x %in% names(dat)) next
  dat[paste0(x, "_COMB")] <- paste(dat[[col]], dat[[x]])
  dat[c(col, x)] <- NULL
}
dat
...