Необходимо разбить столбец, содержащий различное количество дважды сцепленных данных имен переменных и наблюдений - PullRequest
1 голос
/ 27 апреля 2019

У меня есть столбец «sample_values» с различным количеством дважды сцепленных данных, разделенных символами «,» и «:».Мне нужно сделать значения, разделенные "," в новые переменные (столбцы) и значения, разделенные ":" наблюдения этих новых переменных.Небольшое подмножество проблемных data.frame показано здесь:

```{r}
> CDR3 <- c("CASSKGTGGPYEQYF", "CASSSDTDPSYGYTF", "CASSFGTGKNTEAFF", "CASSPRPRYYEQYF")
> sample_values <- c("sample_a:36,sample_b:24,sample_c:56", "sample_a:47", "sample_a:73,sample_b:12", "sample_c:76,sample_d:89")
> df <- data.frame(CDR3, sample_values)
> df
             CDR3                       sample_values
1 CASSKGTGGPYEQYF sample_a:36,sample_b:24,sample_c:56
2 CASSSDTDPSYGYTF                         sample_a:47
3 CASSFGTGKNTEAFF             sample_a:73,sample_b:12
4  CASSPRPRYYEQYF             sample_c:76,sample_d:8
```  

Я хотел бы закончить со следующим результатом:

```{r}
             CDR3 sample_a sample_b sample_c sample_d
1 CASSKGTGGPYEQYF       36       24       56        0
2 CASSSDTDPSYGYTF       47        0        0        0
3 CASSFGTGKNTEAFF       73       12        0        0
4  CASSPRPRYYEQYF        0        0       76       89
```  

Я отмечу, что отсутствиенаблюдение следует интерпретировать как ноль.

Я пытался сделать это, используя различные комбинации separate() и spread() из пакета tidyr, а также cSplit() из пакета splitstackshape.Не удалось выполнить параметры tidyr из-за разного количества наблюдений, которые нужно разделить в столбце, а параметр splitstackshape не удалось из-за недостатка памяти (размер файла данных без ограничений составляет 485 МБ).

1 Ответ

0 голосов
/ 27 апреля 2019

Используя tidyverse, мы можем сначала объединить все sample_values в отдельные строки, затем separate имена и значения столбцов в отдельные столбцы и, наконец, spread в широкоформатный формат, заполнив отсутствующие значения 0.

library(tidyverse)

df %>%
  separate_rows(sample_values, sep = ",") %>%
  separate(sample_values, into = c("col", "values"), sep = ":") %>%
  spread(col, values, fill = 0)


# CDR3            sample_a sample_b sample_c sample_d
#  <fct>           <chr>    <chr>    <chr>    <chr>   
#1 CASSFGTGKNTEAFF 73       12       0        0       
#2 CASSKGTGGPYEQYF 36       24       56       0       
#3 CASSPRPRYYEQYF  0        0        76       89      
#4 CASSSDTDPSYGYTF 47       0        0        0       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...