需要拆分包含不同数量的变量名称和观察的双重连接数据的列

问题描述 投票:1回答:1

我有一个“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()包中的splitstackshapetidyr选项失败,因为在列中分隔的观察数量不同,并且splitstackshape选项由于内存不足而失败(未删节的数据文件大小为485 MB)。

r reshape tidyr reshape2 splitstackshape
1个回答
0
投票

使用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       
© www.soinside.com 2019 - 2024. All rights reserved.