如何在数据框中的每种情况下都删除一些字符而不删除它?

How to remove some characters without removing it in every case in a dataframe?

我有一个数据集,其中我按 Gene 列分组,因此行被压缩为具有多个值。看起来像:

Gene     col1        col2        col3
Gene1    0.02, 0.3   ., ., .     0.2, 0.5
Gene2    1, .        ., ., ,     .

我正在尝试清除所有 ., 的情况,这样我就可以只使用空单元格或只使用逗号分隔的数值(在下一步中,我将 select 最小值或最大值我存储在单元格中的逗号分隔值中的每个基因和列的值)

为了删除 ., 我正在尝试:

data <- data.frame(lapply(data, function(x) {
  gsub(".,", "", x)
}))

但这给了我:

Gene     col1        col2         col3
Gene1    0.02 0.3     .           0.2 0.5    #comma is now missing between my numbers
Gene2    1 .          .           .

我想在每个单元格中的数值之间保留逗号 - 我该怎么做?我认为使用 gsub(".,", "", x) 会专门查找 ., 但我可以看到它没有。

我还计划使用相同的 gsub 代码来替换我即将成为 NA 的现在的单数句号 - 可以为此目的重新使用我的上述代码吗?

对于完整的上下文,我的真实数据是 200 列 x 37k 行 - 我的许多列都包含 .,,而不仅仅是 3。在 运行 上面的 gsub 代码之前,我我只是在读文件,首先是 运行:

data <- setDT(df)[, lapply(.SD, paste, collapse = ", "), by = Genes]

也许试试这个:

#Code
dfres <- as.data.frame(sapply(data, function(x) gsub('.,','',x,fixed = T)))

输出:

   Gene      col1 col2     col3
1 Gene1 0.02, 0.3    . 0.2, 0.5
2 Gene2      1, .    ,        .

数据:

df <- data.frame(
   col1 = c("1.2, 4.0", "1.7", "23, 9.0"),
   col2 = c("., .,", ".,", ".,")
)

解决方案:

df <- sapply(df, function(x) gsub("(?<!\d\s)\.,", "", x, perl = T))

此解决方案在 (?<!\d\s) 中使用负向后视(“如果您没有在左侧看到...,则匹配”);也就是说,如果 ., 前面有一个数字和一个空白字符,则 实现了对 ., 的替换。

df
     col1       col2
[1,] "1.2, 4.0" " " 
[2,] "1.7"      ""  
[3,] "23, 9.0"  ""  

只需要修改你的正则表达式。我不是最擅长正则表达式的,但这会得到你想要的输出:

#your data    
data <- data.frame(Gene = c("Gene1", "Gene2"), 
                   col1 = c("0.02, 0.3", "1, ."),
                   col2 = c("., ., .", "., ., ,"),
                   col3 = c("0.2, 0.5", "."))

#the code you're looking for:
data.frame(lapply(data, function(x) {
  gsub("\.,|\.$|\,$|(, .$)", "", x)
}))

输出:

   Gene      col1 col2     col3
1 Gene1 0.02, 0.3      0.2, 0.5
2 Gene2         1              

你看,gsub 使用了正则表达式模式,“.”如果我没记错的话,和“,”是特殊字符,所以你必须转义它。您想要的正确模式应该是:

gsub("\.\,", "", x)

选项dplyr

library(dplyr)
library(stringr)
data %>% 
    mutate(across(starts_with('col'), ~ str_remove_all(., '\.,')))

-输出

#  Gene      col1 col2     col3
#1 Gene1 0.02, 0.3    . 0.2, 0.5
#2 Gene2      1, .    ,        .