Как изменить форму листа Excel с заголовком в три строки, чтобы упорядочить формат данных?

Я пытаюсь преобразовать лист Country Ratings, Status из файла Excel 2020_Country_and_Territory_Ratings_and_Statuses_FIW1973-2020.xlsx в аккуратный формат данных. Ссылка на файл

В этом процессе я загрузил книгу и сохранил ее в CSV-файл под названием Freedom.csv.

Файл CSV выглядит так: Ввод данных

Информация, которую я систематизирую и собираю из этого CSV:

  1. Страна
  2. Год (ы) на рассмотрении
  3. PR
  4. CL
  5. Положение дел

Как бы вы преобразовали файл в этот формат?

Код, который я пытался использовать в файле, был

library(tidyverse)
filelocation<- "./Data/"
FreedomIndex <- read.csv(file = paste0(filelocation,'Freedom.csv'),skip=2)

col2 = paste(rep(c("PR", "CL", "Status"), 47),rep(1973:2019, each=3),
             sep = "-")
RenamesCol = c("Country", col2)
colnames(FreedomIndex) = RenamesCol

Freedomtidy<-FreedomIndex %>%
  pivot_longer(cols = c(col2), names_to = "Type", values_to = "Freedom") %>%
  arrange("Country")

Freedomtidy = separate(data = Freedomtidy, col = Type, into = c("Type", "year"),
                       sep = "-")

Freedomtidy %>%
  pivot_wider(names_from = "Type", values_from = "Freedom") %>%
  arrange("Country", "year")

Freedomtidy %>%
  pivot_wider(id_cols = c("Country", "year"), names_from = "Type",
              values_from = "Freedom") %>%
  arrange("Country", "year")

Этот код не преобразовал данные в требуемый формат. Я получил ‹chr 1› в возвращенных данных. Изображение для вывода данных

Также важно отметить, что списки во фрейме данных выглядят следующим образом:

Freedomtidy$PR[1]

Выход:

[[1]]
[1] "4"

Я проверил ваши коды с небольшим изменением с pivot_longer(cols = c(col2) на pivot_longer(cols = all_of(col2). Столбцы не преобразуются в столбцы-списки. Вы можете попробовать.   —  person Bonnie    schedule 30.01.2021

Спасибо, что внесли это изменение, он по-прежнему возвращает список. Фреймворк данных, возвращенный в конце, содержит столбцы: Страна ‹chr›, год ‹chr›, PR ‹list›, CL ‹list›, Статус ‹list›. В качестве примера вывод «Freedomtidy $ PR [1]» возвращает [[1]] [1] 4   —  person Bonnie    schedule 30.01.2021

Это странно. Я запустил коды с небольшими изменениями, и я не получил столбцов списка. Возможно, вы захотите проверить, используете ли вы последнюю версию пакета.   —  person Bonnie    schedule 30.01.2021

См. также:  Различные уровни доступа для AWS Cognito
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Bonnie

    Попробуйте добавить values_fn как toString в pivot_wider:

    library(tidyverse)
    
    Freedomtidy %>%
      pivot_wider(id_cols = c("Country", "year"), 
                  names_from = Type, values_from = Freedom, values_fn = toString) %>%
      arrange(Country, year) -> result
    
    result
    
  2. Bonnie

    Частично проблема заключается в том, что в строке группировки «Проверяемые годы» нет строго числовых значений года. Есть значения, разделенные на год, например. Январь 1981 г. — август 1982 г. Вы можете заранее объединить такие столбцы, чтобы они относились к целому году для согласованности.

    Я создал альтернативное решение, которое дает фрейм данных длинного формата с вашими данными как есть. Я прочитал файл Excel напрямую: не нужно сначала экспортировать в CSV.

    library(tidyverse)
    library(readxl)
    
    # first three rows (header)
    hdr <- read_xlsx("2020_Country_and_Territory_Ratings_and_Statuses_FIW1973-2020.xlsx",
                        sheet="Territory Ratings, Statuses",
                        n_max = 3,
                        col_names = FALSE,
                        col_type="text")
    
    # list of column names
    cnames <- as.character(hdr[3,])
    
    # 'minimal' will give column names as-is, ie. not unique
    df <- read_xlsx("2020_Country_and_Territory_Ratings_and_Statuses_FIW1973-2020.xlsx",
                    sheet="Territory Ratings, Statuses",
                    skip=3,
                    col_names=cnames,
                    .name_repair = "minimal")
    
    # merged cells in header
    groups1 <- hdr[2,]
    unique_groups <- group1[!is.na(group1)][-1]
    
    # explicitly set empty column name
    names(df)[1] <- "Country"
    
    # tag all other columns by group (ie. year)
    # repeat in groups of 3 for PR, CL, Status
    names(df)[-1] <- paste0(names(df)[-1], ".",
                            rep(unique_groups, each=3))
    
    result <- df %>%
      gather(variable,value,-Country) %>%
      mutate(year = substr(variable,nchar(variable)-3,nchar(variable))) %>%
      mutate(variable =  gsub("\\.\\d{4}","",x = variable)) %>%
      arrange(Country,variable,year)
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: