如何将竖线分隔的两列表格转换为宽格式或长格式data frame
基于tidyverse的完整解决代码
假设你的原始输入数据框命名为cmo_raw,三列列名分别为barcode(第一列的细胞barcode)、cmo_list(第二列的|分隔CMO编号)、umi_list(第三列的|分隔UMI计数),如果你的列名不同可对应替换。
# 加载依赖包 library(tidyverse) # 生成期望输出B(长格式) cmo_long <- cmo_raw %>% # 同时拆分CMO和UMI列,保证两者一一对应不错位 separate_rows(cmo_list, umi_list, sep = "\\|", convert = TRUE) %>% # 重命名为你要求的列名 rename(feature_call = cmo_list, num_umis = umi_list) # 生成期望输出A(宽格式) cmo_wide <- cmo_long %>% pivot_wider( id_cols = barcode, names_from = feature_call, values_from = num_umis, values_fill = 0 )
关键说明
- 你之前用
separate_rows()没成功大概率是没有同时传入两个需要拆分的列,单独拆分两列会出现CMO和UMI不匹配的问题,同时传入即可解决 sep = "\\|"是因为|是正则特殊字符,需要双反斜杠转义才能被识别为普通分隔符convert = TRUE会自动把UMI计数从字符串转为数值类型,无需额外转换- 你给出的输出B示例中的CMO304不在你提供的输入数据范围内,属于示例笔误,实际运行会输出输入数据包含的所有CMO对应结果
内容的提问来源于stack exchange,提问作者bud.dugong
相关产品推荐
相关产品推荐

