r - 如何将 2 列 (X, Y)、管道分隔的表格转换为 X by Y 数据框或长格式?

标签 r split formatting

我花了最后一个小时尝试将 2 列格式重新格式化为更有用的格式。

我有以下输入(一个 2 列数据框/tibble):

输入

TGGGAAGGTTATGTGC-1  CMO305|CMO306|CMO312    3698|3806|12182
TGTTCTACATGACAGG-1  CMO305|CMO306|CMO312    3027|1449|4184
ACTGATGCAGAGTGAC-1  CMO305|CMO307   6802|4715
ATCGTCCGTTACCCAA-1  CMO305|CMO307   5599|7019
ATGCATGTCATGACAC-1  CMO305|CMO307   10872|16729
GTGAGTTAGTCCGCCA-1  CMO305|CMO307   10096|3434

期望的输出(A-宽)

<表类="s-表"> <头> <日> CMO305 CMO306 CMO307 CMO312 <正文> TGGGAAGGTTATGTGC-1 3698 3806 0 12182 TGTTCTACATGACAGG-1 3027 1449 0 4184 ACTGATGCAGAGTGAC-1 6802 0 4715 0 ATCGTCCGTTACCCAA-1 5599 0 7019 0 ATGCATGTCATGACAC-1 10872 0 16729 0 GTGAGTTAGTCCGCCA-1 10096 0 3434 0

期望的输出(B - 长格式)

> CMO.umis.long
   feature_call num_umis
   <chr>           <dbl>
 1 CMO304           2168
 2 CMO304          14210
 3 CMO304           7009
 4 CMO304           5931
 5 CMO304           7147
 6 CMO304           1683

我很确定这个问题已经得到解答,但我似乎找不到合适的搜索词。

separate_rows() 可能是方法,但我无法正确拆分...

谢谢,感谢您的帮助!

最佳答案

假设列名为 'col1'、'col2'、'col3',在 col2 和 col3 上使用 separate_rowssep|(regex 模式是默认模式 - 因此转义元字符 | 以按字面意思读取它),然后使用 pivot_wider reshape 回“宽”来自 tidyr

library(dplyr)
library(tidyr)
long_df <- df1 %>%
   mutate(rn = row_number()) %>% 
   separate_rows(c(col2, col3), sep = "\\|", convert = TRUE)

-输出

long_df %>%
   select(col2, col3)
# A tibble: 14 × 2
   col2    col3
   <chr>  <int>
 1 CMO305  3698
 2 CMO306  3806
 3 CMO312 12182
 4 CMO305  3027
 5 CMO306  1449
 6 CMO312  4184
 7 CMO305  6802
 8 CMO307  4715
 9 CMO305  5599
10 CMO307  7019
11 CMO305 10872
12 CMO307 16729
13 CMO305 10096
14 CMO307  3434

或者如果我们需要宽幅

wide_df <- long_df %>% 
   pivot_wider(names_from = col2, values_from = col3, values_fill = 0) %>%
    select(-rn)

-输出

wide_df
# A tibble: 6 × 5
  col1               CMO305 CMO306 CMO312 CMO307
  <chr>               <int>  <int>  <int>  <int>
1 TGGGAAGGTTATGTGC-1   3698   3806  12182      0
2 TGTTCTACATGACAGG-1   3027   1449   4184      0
3 ACTGATGCAGAGTGAC-1   6802      0      0   4715
4 ATCGTCCGTTACCCAA-1   5599      0      0   7019
5 ATGCATGTCATGACAC-1  10872      0      0  16729
6 GTGAGTTAGTCCGCCA-1  10096      0      0   3434

数据

df1 <- structure(list(col1 = c("TGGGAAGGTTATGTGC-1", "TGTTCTACATGACAGG-1", 
"ACTGATGCAGAGTGAC-1", "ATCGTCCGTTACCCAA-1", "ATGCATGTCATGACAC-1", 
"GTGAGTTAGTCCGCCA-1"), col2 = c("CMO305|CMO306|CMO312", "CMO305|CMO306|CMO312", 
"CMO305|CMO307", "CMO305|CMO307", "CMO305|CMO307", "CMO305|CMO307"
), col3 = c("3698|3806|12182", "3027|1449|4184", "6802|4715", 
"5599|7019", "10872|16729", "10096|3434")), 
class = "data.frame", row.names = c(NA, 
-6L))

关于r - 如何将 2 列 (X, Y)、管道分隔的表格转换为 X by Y 数据框或长格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69620864/

相关文章:

python - 执行 R 脚本后将结果获取到 python 变量

r - 通过在批处理文件中获取 R 脚本使其可执行

python - 将逗号分隔的数据转换为不带 CSV 模块的列表

PowerShell:没有标题的格式表

html - 样式化单个 bsTooltip (shinyBS) 元素

R 从数据集中的定制子集中获取分位数和平均值

mysql - 根据表中的值将 MySQL 行拆分为多行

java - 我想用以下符号拆分我的字符串 : +, -, *,/但是 .split 函数只接受一个

c# - 大写的UTF-8?

javascript - 从帧创建时间码