Несколько строк в несколько столбцов Dataframe в R с отдельным первым столбцом в качестве заголовка столбца - PullRequest
0 голосов
/ 16 марта 2020

Я новичок в R, и я хотел бы преобразовать несколько строк в кадр данных с несколькими столбцами в R с отдельным первым столбцом в качестве заголовка столбца

Например:

> dat <- read.table(text = "Company    Loc 100000012,104 100000012,105
> 100000012,107 
> 100000012,102 
> 100000012,166 
> 100000012,126 
> 100000012,169
> 100000012,42 
> 100000012,43 
> 100123545,50 
> 100123600,21 
> 100123600,10",
> header = TRUE)

transforms на следующий

> 100000012,100123545,100123600 
> 104,50,21 
> 105,,10 
> 107,, 
> 102,, 
> 166,,
> 126,, 
> 169,, 
> 42,, 
> 43,,

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 16 марта 2020

Вот базовое решение R, использующее lapply + split, т. Е.

datout <- data.frame(t(do.call(rbind,
                               lapply(u<-lapply(split(dat,dat$Company),`[[`,2),
                                      `length<-`,
                                      max(lengths(u))))),
                     check.names = FALSE)

, такое что

> datout
   100000012  100123545  100123600
1        104         50         21
2        105         NA         10
3        107         NA         NA
4        102         NA         NA
5        166         NA         NA
6        126         NA         NA
7        169         NA         NA
8         42         NA         NA
9         43         NA         NA

DATA

dat <- structure(list(Company = c(100000012L, 100000012L, 100000012L, 
100000012L, 100000012L, 100000012L, 100000012L, 100000012L, 100000012L, 
100123545L, 100123600L, 100123600L), Loc = c(104L, 105L, 107L, 
102L, 166L, 126L, 169L, 42L, 43L, 50L, 21L, 10L)), class = "data.frame", row.names = c(NA, 
-12L))
0 голосов
/ 16 марта 2020

Вот подход tidyverse:

dat %>%
  mutate(rn = row_number()) %>%
  pivot_wider(id_cols = c(Company, rn), names_from = Company, values_from = Loc) %>%
  as.data.frame() %>%
  select(-rn) %>%
  mutate_all(~(.[order(is.na(.))])) %>%
  filter_all(any_vars(!is.na(.))) %>%
  unite(result, everything(), sep = ',')

Выход

     result
1 104,50,21
2 105,NA,10
3 107,NA,NA
4 102,NA,NA
5 166,NA,NA
6 126,NA,NA
7 169,NA,NA
8  42,NA,NA
9  43,NA,NA
0 голосов
/ 16 марта 2020

Попробуйте:

  1. Пропустите заголовок, так как разделитель отсутствует.
  2. Установите разделитель на ","
  3. Назовите столбцы вручную
dat <- read.table(text = "Company    Loc 100000012,104 100000012,105
100000012,107 
100000012,102 
100000012,166 
100000012,126 
100000012,169
100000012,42 
100000012,43 
100123545,50 
100123600,21 
100123600,10", skip = 1, sep = ",")
names(dat) <- c("Company", "Loc")
dat
#>      Company Loc
#> 1  100000012 107
#> 2  100000012 102
#> 3  100000012 166
#> 4  100000012 126
#> 5  100000012 169
#> 6  100000012  42
#> 7  100000012  43
#> 8  100123545  50
#> 9  100123600  21
#> 10 100123600  10

Создано в 2020-03-16 пакетом Представить (v0.3.0)

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