переименовать список столбцов данных в объединенные суффиксы mimi c - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть список фреймов данных:

dd <- list()

dd$data <- list(
  ONE = data.frame(inAll = c(1.1,1.2,1.3), inAll_2 = c(1.4,1.5,1.6)),
  TWO = data.frame(inAll = c(2.1,2.2,2.3), inAll_2 = c(2.4,2.5,2.6)),
  THREE = data.frame(inAll = c(3.1,3.2,3.3), inAll_2 = c(3.4,3.5,3.6)),
  FOUR = data.frame(inAll = c(4.1,4.2,4.3), inAll_2 = c(4.4,4.5,4.6)),
  FIVE = data.frame(inAll = c(5.1,5.2,5.3), inAll_2 = c(5.4,5.5,5.6)),
  SIX = data.frame(inAll = c(6.1,6.2,6.3), inAll_2 = c(6.4,6.5,6.6))
)

И затем уменьшите эти фреймы данных, используя суффиксы

reduce(dd$data, full_join, by = "inAll", suffix = c("_x", "_y"))

Мой желаемый вывод -

map(dd$data, list())

НО I хотите, чтобы имена были такими же, как суффиксы в сокращенном наборе данных.

Как расширить эту функцию карты, чтобы я переименовал столбцы в списке, чтобы отразить сокращенные имена?

PATTERN:

[Я пытался просмотреть соединение исходный код для этого!] и похоже, что все соответствующие, но не объединенные столбцы:

  • с заданным _x, затем _y суффиксом
  • , это продолжается с _x_x и _y_y и т. д.
  • если число элементов списка с повторяющимся столбцом без суффикса последний

Обратите внимание, что эти кадры данных в моем примере обычно имеют другие столбцы И столбцы не всегда находятся в одном и том же порядке поэтому я хочу избегать всего, что угодно, например * сопоставления по индексу!

new_names <- function(df) {
  # logic about new suffixes somehow
  map(df,list())
}

Желаемый вывод

Список, который выглядит следующим образом:

dd$data2 <- list(
  ONE = data.frame(inAll = c(1.1,1.2,1.3), inAll_2_x = c(1.4,1.5,1.6)),
  TWO = data.frame(inAll = c(2.1,2.2,2.3), inAll_2_y = c(2.4,2.5,2.6)),
  THREE = data.frame(inAll = c(3.1,3.2,3.3), inAll_2_x_x = c(3.4,3.5,3.6)),
  FOUR = data.frame(inAll = c(4.1,4.2,4.3), inAll_2_y_y = c(4.4,4.5,4.6)),
  FIVE = data.frame(inAll = c(5.1,5.2,5.3), inAll_2_x_x_x = c(5.4,5.5,5.6)),
  SIX = data.frame(inAll = c(6.1,6.2,6.3), inAll_2_y_y_y = c(6.4,6.5,6.6))
)

1 Ответ

1 голос
/ 22 апреля 2020

Мы можем создать повторяющуюся символьную строку с strrep (из base R) для 'x', 'y', rep, лицензировать ее, l oop над столбцом list с map2 и rename_at 2-й столбец с paste ing (str_c) переданным суффиксом

library(dplyr)
library(purrr)
library(stringr)
n <- ceiling(length(dd$data)/2)
map2(dd$data,  strrep(rep(c('_x', '_y'), n), rep(seq_len(n), each = 2)), ~
             {nm <- .y
               .x %>% 
                 rename_at(vars(inAll_2), ~ str_c(., nm))
     })
#$ONE
#  inAll inAll_2_x
#1   1.1       1.4
#2   1.2       1.5
#3   1.3       1.6

#$TWO
#  inAll inAll_2_y
#1   2.1       2.4
#2   2.2       2.5
#3   2.3       2.6

#$THREE
#  inAll inAll_2_x_x
#1   3.1         3.4
#2   3.2         3.5
#3   3.3         3.6

#$FOUR
#  inAll inAll_2_y_y
#1   4.1         4.4
#2   4.2         4.5
#3   4.3         4.6

#$FIVE
#  inAll inAll_2_x_x_x
#1   5.1           5.4
#2   5.2           5.5
#3   5.3           5.6

#$SIX
#  inAll inAll_2_y_y_y
#1   6.1           6.4
#2   6.2           6.5
#3   6.3           6.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...