mutateacross中的str_replace与cur_column中的第n个字符匹配

问题描述

我的目标摘要

我具有以下数据框结构:

my.df <-data.frame("col1_A.C"=c("AA","AC","CC"),"col2_A.T"=c("TT","AT","TT"),"col3_C.G"=c("GG","CG","CG"))

my.df
#   col1_A.C col2_A.T col1_C.G
# 1       AA       TT       GG
# 2       AC       AT       CG
# 3       CC       TT       CG

对于每列,我想将与列名的倒数第3个字符匹配的任何字符替换为字符“ R”。

因此,我想使用以上数据框来获取此信息:

my.df2 <- data.frame("col1_A.C"=c("RR","RC","RT","RG","RG"))

my.df2
#   col1_A.C col2_A.T col1_C.G
# 1       RR       TT       GG
# 2       RC       RT       RG
# 3       CC       TT       RG

例如,在第一列中,列名称为 col1_A.C ,而 A 是倒数第三位。因此,所有 A 都被替换为 R

到目前为止我的代码

为此,我制作了以下代码

my.df2 <- my.df %>% mutate(across(.cols=everything(),.funs=str_replace_all(.,substr(cur_column(),nchar(cur_column()-2),nchar(cur_column()-2)
                                                              ),"R")
                                  )
                           )

不幸的是,生成的数据框 my.df2 看上去与 my.df 完全一样,并且没有字符替换。尽管没有错误返回。

我已经按照以下方式测试了 str_replace_all()方法,该方法适用于矢量。我想象然后在 mutate(across())函数中解释 str_replace_all()的方式中我缺少/不了解。

first.column <- c("CC","CT","CC")

first.column <- str_replace_all(first.column,substr(colnames(my.df)[1],nchar(colnames(my.df)[1])-2,nchar(colnames(my.df)[1])-2
                                       ),"R")
print(first.column)
# [1] "RR" "RT" "RR"

我用尽了所有可能无效的想法。我对R及其功能的理解不是很全面,因此如果我错过了一些简单的事情,我深表歉意。我也搜索了类似的问题,但无济于事。

解决方法

您可以使用Map

my.df[] <- Map(function(x,y) gsub(y,'R',x),my.df,substring(names(my.df),nchar(names(my.df)) - 2,nchar(names(my.df)) - 2))

my.df
#  col1_A.C col2_A.T col3_C.G
31       RR       TT       GG
#2       RC       RT       RG
#3       CC       TT       RG

将@thelatemail的chartr技巧与imap_dfc中的purrr结合使用:

purrr::imap_dfc(my.df,~chartr(substr(.y,nchar(.y)-2,nchar(.y)-2),.x))
,

我认为您只需要波浪号~,并使用.fns而不是.funs

my.df %>% 
  mutate(
    across(
      .cols = everything(),.fns = ~ str_replace_all(
        string = ..1,pattern = str_sub(cur_column(),nchar(cur_column()) - 2,nchar(cur_column()) - 2),replacement = "R"
      )
    )
  )
,

首先将您的数据从宽格式转换为长格式,即可达到相同的目的

library(tidyverse)

my.df %>%
  gather(colx,rowx) %>%
  mutate(rowx = str_replace_all(rowx,substring(colx,nchar(colx) - 2,nchar(colx) - 
                  2),"R")) %>%
  group_by(colx) %>% 
  mutate(id = row_number()) %>%
  pivot_wider(names_from = colx,values_from = rowx)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...