需要拆分包含变量名称和观察值的不同数量的双重连接数据的列
Need to split a column containing varying numbers of doubly concatenated data of variable names and observations
我有一列 "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
```
我会注意到,缺少观察值应被解释为零。
我尝试使用 tidyr
包中的 separate()
和 spread()
的各种组合以及 splitstackshape
包中的 cSplit()
. tidyr
选项失败,因为列中要分隔的观察值数量不同,splitstackshape
选项失败,因为内存不足(未删节的数据文件大小为 485 MB)。
使用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
我有一列 "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
```
我会注意到,缺少观察值应被解释为零。
我尝试使用 tidyr
包中的 separate()
和 spread()
的各种组合以及 splitstackshape
包中的 cSplit()
. tidyr
选项失败,因为列中要分隔的观察值数量不同,splitstackshape
选项失败,因为内存不足(未删节的数据文件大小为 485 MB)。
使用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