问题描述
我的目标摘要
我具有以下数据框结构:
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)