Как транспонировать столбцы в сгруппированных данных в R? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть фрейм данных (df), сгруппированный по CompanyID (2 компании), и есть информация по годам (2006 и 2007).

df <- 
CompanyID  Name Country ISIN     Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
25830   BANKxxx Austria AT000504 11734844255   M         2     3     1          0.4         5        0.48          11734844255   M         1     4      5           1        0.32          0.2
25830   BANKxxx Austria AT000504 1878371165    F         NA    NA    NA         NA          NA       NA            5524344997    F         NA    NA     NA          NA       NA            NA
25830   BANKxxx Austria AT000504 5524344997    F         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA
25830   BANKxxx Austria AT000504 5524354997    M         NA    NA    NA         NA          NA       NA            5742347684    M         NA    NA     NA          NA       NA            NA
25830   BANKxxx Austria AT000504 6613115791    M         NA    NA    NA         NA          NA       NA            40160443378   M         NA    NA     NA          NA       NA            NA
12339   BANKyyy Belgium AT034003 5524344997    M         0     2    0           0           2        0             5524344997    M         0     2      2           0        0             0
12339   BANKyyy Belgium AT034003 5524354997    M         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA

Я хотел бы переместить некоторые столбцы (Findex, Fperce, Blauindex и Total) на 2006 и 2007 годы.

Таким образом, мой ожидаемый результат будет выглядеть так:

df_final <-
Name     CompanyID  ISIN     Country  Year  Findex  Fperce  Blauindex  Total
BANKxxx  25830      AT000504 Austria  2006   1       0.4    0.48         5
                                      2007   1       0.2    0.32         5
BANKyyy  12339      AT034003 Belgium  2006   0       0      0            2
                                      2007   0       0      0            2

Пожалуйста, кто-нибудь может мне посоветовать? Спасибо.

DATA

df <- read.table(text = 
        "CompanyID  Name    Country ISIN     Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
         25830  BANKxxx Austria AT000504 11734844255   M         2     3     1          0.4         5        0.48          11734844255   M         1     4      5           1        0.32          0.2
         25830  BANKxxx Austria AT000504 1878371165    F         NA    NA    NA         NA          NA       NA            5524344997    F         NA    NA     NA          NA       NA            NA
         25830  BANKxxx Austria AT000504 5524344997    F         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA
         25830  BANKxxx Austria AT000504 5524354997    M         NA    NA    NA         NA          NA       NA            5742347684    M         NA    NA     NA          NA       NA            NA
         25830  BANKxxx Austria AT000504 6613115791    M         NA    NA    NA         NA          NA       NA            40160443378   M         NA    NA     NA          NA       NA            NA
         12339  BANKyyy Belgium AT034003 5524344997    M         0     2    0           0           2        0             5524344997    M         0     2      2           0        0             0
         12339  BANKyyy Belgium AT034003 5524354997    M         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA",
        header = T, stringsAsFactors = F)

1 Ответ

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

Вот рабочий процесс на основе dplyr. Я выбираю интересующие вас столбцы, используя matches, чтобы дать регулярное выражение для сопоставления имен столбцов, чтобы избавиться от необходимости выписывать «Findex2006», «Findex2007» и т. Д. Это особенно удобно, если в итоге вы получите более только эти два года для работы. Затем я собрал данные в длинный формат, исключая от CompanyID до ISIN. Затем separate с sep = -4 разделяет measure (например, «Findex2006») на два столбца, где значение для второго столбца начинается с 4 символов в конце каждой строки (например, «Findex» и «2006»). Там было несколько NA, которые я отфильтровал, а затем spread возвращает их в широкую форму, но столбец больше не основывается на годе.

library(tidyverse)

df <- read.table(text = 
                                    "CompanyID  Name    Country ISIN     Director2006 Gender2006 F2006 M2006 Findex2006 Fperce2006 Total2006 Blauindex2006 Director2007 Gender2007 F2007 M2007 Total2007 Findex2007 Blauindex2007 Fperce2007
                                 25830  BANKxxx Austria AT000504 11734844255   M         2     3     1          0.4         5        0.48          11734844255   M         1     4      5           1        0.32          0.2
                                 25830  BANKxxx Austria AT000504 1878371165    F         NA    NA    NA         NA          NA       NA            5524344997    F         NA    NA     NA          NA       NA            NA
                                 25830  BANKxxx Austria AT000504 5524344997    F         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA
                                 25830  BANKxxx Austria AT000504 5524354997    M         NA    NA    NA         NA          NA       NA            5742347684    M         NA    NA     NA          NA       NA            NA
                                 25830  BANKxxx Austria AT000504 6613115791    M         NA    NA    NA         NA          NA       NA            40160443378   M         NA    NA     NA          NA       NA            NA
                                 12339  BANKyyy Belgium AT034003 5524344997    M         0     2    0           0           2        0             5524344997    M         0     2      2           0        0             0
                                 12339  BANKyyy Belgium AT034003 5524354997    M         NA    NA    NA         NA          NA       NA            5524354997    M         NA    NA     NA          NA       NA            NA",
                                 header = T, stringsAsFactors = F)

df %>%
    select("CompanyID", "Name", "Country", "ISIN", matches("Findex|Fperce|Blauindex|Total")) %>%
    gather(key = measure, value = value, -CompanyID:-ISIN) %>%
    separate(measure, into = c("measure", "Year"), sep = -4) %>%
    filter(!is.na(value)) %>%
    spread(key = measure, value = value)
#>   CompanyID    Name Country     ISIN Year Blauindex Findex Fperce Total
#> 1     12339 BANKyyy Belgium AT034003 2006      0.00      0    0.0     2
#> 2     12339 BANKyyy Belgium AT034003 2007      0.00      0    0.0     2
#> 3     25830 BANKxxx Austria AT000504 2006      0.48      1    0.4     5
#> 4     25830 BANKxxx Austria AT000504 2007      0.32      1    0.2     5

Создано в 2018-05-09 пакетом Представ (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...