Перемещение реплицированных данных в следующие столбцы в R - PullRequest
0 голосов
/ 03 октября 2019

мои данные следующие:

df <- read.table(text = "M	X	Z
 'bam'	12	'B1'
 'sdr'	11	'B3'
                  'kar'	13	'B5'
                 'mmn'	13	'B7'
                   'bam'	14	'B4'
                   'kar'	17	'B1'
                   'bam'	10	'B6'
                   'zar'	11	'B8'
                   'mmn'	12	'B12'
                   
                  ", header = TRUE)

Я хочу переместить реплицированные данные в следующий столбец. Учитывая "бац", он появляется три раза. Теперь я хочу переместить его в следующий столбец, где он появляется впервые, другие реплицированные данные появятся в других столбцах. Когда реплицированные данные перемещаются в другие столбцы, они будут удалены из столбцов, чтобы получить следующие таблицы:

df <- read.table(text = " M	X	Z	X1	Z1	X2	Z2
 'bam'	12	'B1'	14	'B4'	10	'B6'
                   'sdr'	11	'B3'	NA	NA	NA	NA
                   'kar'	13	'B5'	17	'B1'	NA	NA
                   'mmn'	13	'B7'	12	'B12'	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                  NA	NA	NA	NA	NA	NA	NA
                  'zar'	11	'B8'	NA	NA	NA	NA
                   NA	NA	NA	NA	NA	NA	NA
                   
                 
                 ", header = TRUE)
> df

Я понимаю, что мне нужно дать свое решение, но я не смог найти решение.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Один из возможных способов - использовать unnest_wider() в tidyr. Когда это не указано, имя элемента списка будет автоматически использоваться в качестве имени столбца.

Я считаю, что есть лучший способ построения списка records, но в настоящее время это лучшее, что я могу придумать.

library(dplyr)
library(tidyr)

df1 <- df %>%
    group_by(M) %>%
    # convert column X and Z to a list column with each element named as
    # X_1,X_2,... and Z_1,Z_2, ...
    summarise(records = list(
        append(
            as.list(X) %>% setNames(paste0("X_",seq_along(X))),
            as.list(Z) %>% setNames(paste0("Z_",seq_along(Z)))
        ))
    ) %>%
   # when unnested, the name for a list element will be automated applied the the column name
    unnest_wider(records)
> df1

# A tibble: 5 x 7
  M       X_1   X_2   X_3 Z_1   Z_2   Z_3  
  <chr> <int> <int> <int> <chr> <chr> <chr>
1 bam      12    14    10 B1    B4    B6   
2 kar      13    17    NA B5    B1    NA   
3 mmn      13    12    NA B7    B12   NA   
4 sdr      11    NA    NA B3    NA    NA   
5 zar      11    NA    NA B8    NA    NA   

0 голосов
/ 03 октября 2019

Вот один из вариантов, циклически проходя по names набора данных, кроме первого, сгруппированного по 'M', summarise в list, используйте unnest_wider, reduce для отдельных данных. кадрирование путем объединения элементов list, затем right_join с исходным набором данных 'M' и переупорядочение столбцов набора данных

library(purrr)
library(tidyr)
library(dplyr)
library(stringr)
map(names(df)[-1], ~ df %>%
       dplyr::select(M, .x) %>% 
       group_by(M) %>%
       summarise(!! .x := list(as.list(!! rlang::sym(.x)) %>% 
                     set_names(str_c(.x, seq_along(.)))))  %>% 
       unnest_wider(.x)) %>% 
  reduce(full_join, by = 'M') %>% 
  right_join(df1 %>%
                dplyr::select(M)) %>% 
  dplyr::select(M, order(str_remove(names(.)[-1], "\\D+")) + 1)
# A tibble: 9 x 7
#  M        X1 Z1       X2 Z2       X3 Z3   
#  <fct> <int> <fct> <int> <fct> <int> <fct>
#1 bam      12 B1       14 B4       10 B6   
#2 sdr      11 B3       NA <NA>     NA <NA> 
#3 kar      13 B5       17 B1       NA <NA> 
#4 mmn      13 B7       12 B12      NA <NA> 
#5 <NA>     NA <NA>     NA <NA>     NA <NA> 
#6 <NA>     NA <NA>     NA <NA>     NA <NA> 
#7 <NA>     NA <NA>     NA <NA>     NA <NA> 
#8 zar      11 B8       NA <NA>     NA <NA> 
#9 <NA>     NA <NA>     NA <NA>     NA <NA> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...