我有一个"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机箱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_d1 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 )而失败。
发布于 2019-04-27 11:07:38
使用tidyverse,我们可以首先将所有的sample_values放入单独的行中,然后将列名和值放入单独的列中,最后将其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 https://stackoverflow.com/questions/55876826
复制相似问题