首页 > 解决方案 > 如何从 R 中的另一个字符串类型列中减去一个字符串类型列?

问题描述

我有两个现有列:A 列和 B 列。我想从 A 列中减去 B 列以得到 C 列。尝试了很多代码,但都不起作用。最好在 R 中完成这项工作。以前有人做过这样的事情吗?

|A                               |    B                        | C    |
|rs17158930-G                    | rs17158930                  | G    |
|snp-120820-?xrs65832-?;rs10405-A| snp-120820xrs65832;rs10405  |?x?;A |
|rs11829119-C;rs17790731-A       |rs11829119;rs17790731        | C;A  |

我稍微更改了数据,数据变得更加复杂。仍然想获得 C 列。我尝试了以下代码,但出现了错误。

    gwas1 %>%
    mutate(row1 = row_number()) %>%
    separate_rows(A, B, sep = ';') %>%
    mutate(row2 = row_number()) %>%
    separate_rows(A, B, sep = 'x') %>%
    transform(b= sub("(.*)-.*", "\\1", A), C= sub(".*-", "", A))%>%
    group_by(row2) %>%
    summarise(across(c(A, B, b), paste0, collapse = 'x'),
        C= paste0(C[b %in% B], collapse = 'x')) %>%
    group_by(row1) %>%
    summarise(across(c(A, B, b), paste0, collapse = ';'),
     C= paste0(C[b %in% B], collapse= ';'))  

错误:必须按在 中找到的变量分组.data

当我使用 生成 row1 列时gwas1<-gwas1%>% mutate(row1=row_number()),错误仍然存​​在。

如何解决?

标签: rstring

解决方案


一种方法是

  • 创建具有行号的列
  • 拆分AB;以将它们放在不同的行中
  • 拆分A'-'
  • 对于每一行,创建C列以仅包含与AB列匹配的值。
  • 再次合并并列成A一行B
library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  separate_rows(A, B, sep = ';') %>%
  separate(A, c('A', 'res'), sep = '-') %>%
  group_by(row) %>%
  summarise(across(c(A, B), paste0, collapse = ';'),
            C = paste0(res[A %in% B], collapse = ';')) %>%
  select(-row) -> result

result

#   A                     B                     C  
#  <chr>                 <chr>                 <chr>
#1 rs17158930            rs17158930            G    
#2 rs16935279;rs10405744 rs16935279;rs10405744 C;A  
#3 rs11829119            rs11829119            C    
#4 rs17066873            rs17066873            C    
#5 rs17790731            rs17790731            A    

数据

df <- structure(list(A = c("rs17158930-G", "rs16935279-C;rs10405744-A", 
"rs11829119-C", "rs17066873-C", "rs17790731-A"), B = c("rs17158930", 
"rs16935279;rs10405744", "rs11829119", "rs17066873", "rs17790731"
)), row.names = c(NA, -5L), class = "data.frame")

推荐阅读