如何从R中的另一个字符串类型列中减去一个字符串类型列?

如何从R中的另一个字符串类型列中减去一个字符串类型列?,r,string,R,String,我有两个现有的列:A列和B列。我想从A列减去B列得到C列。尝试了许多代码,但都不起作用。最好在R完成。以前有人做过类似的事情吗 |A | B | C | |rs17158930-G | rs17158930 | G | |snp-120820-?xrs65832-?;rs10405-A| snp-120

我有两个现有的列: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%mutaterow1=row_number生成row1列时,错误仍然存在


如何解决它?

一种方法是

创建具有行号的列 在上拆分A列和B列;把它们排成不同的行 在“-”上拆分列 对于每一行,创建C列以仅包括A列和B列中匹配的值。 再次将A列和B列合并为一行。 资料


请与我们分享到目前为止您尝试了什么以及您遇到了什么问题。非常感谢您提供的详细信息。如果A列和B列中有多个,该怎么办?例如:A列中:SNP2-179127489-T;rs16935279-C;rs10405744-A,我需要关注的是最后一个-,所以我应该得到B列:SNP2-179127489;rs16935279;rs10405744,C列:T;C有什么解决办法吗?谢谢你试过上面的方法吗?它返回了什么?如果你拥有的数据失败了,你能更新你的帖子,以一种可复制的格式向我们提供这个解决方案失败的数据吗?是的,我试过了。这是我以前的数据。我更新了一个更复杂的数据帧,但仍然希望得到相同的结果。我无法解决代码中的错误。
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")