R:如何使用来自列名的信息来修改 df

问题描述

我有一个 df,我想创建一个函数,如果 columnnname 包含特定的特性,例如读取和修改整个列。 '(字符串)'。如果列名包含 '(str)' 我希望在整个列中的值前后粘贴“'%”和“%'”

#create df
y<- data.frame('criteria1' = c('info','1','info','','info'),"criteria2.(str)" = c('y','3',''),"criteria3" = c('y','7',check.names=FALSE)

预期结果是:

y1<- data.frame('criteria1' = c('info',"criteria2.(str)" = c("'%y%'","'%3%'","'%%'","'%info%'","'%%'"),check.names=FALSE)

我尝试过 lapply 没有运气

 y[]<- lapply(y,function(x) 
                      ifelse(colnames(y)[x] %like% ('(str)'),paste0("'%",x,"%'"),x))

 y[]<- lapply(y,function(x) 
                      ifelse(colnames(y) %like% ('(str)'),x))

with sapply '%x%' 是水平添加的,但不是为列添加

y <- sapply(1:ncol(y),function(x) 
  ifelse(colnames(y) %like% ('.(str)'),x))

非常感谢!

解决方法

使用data.tablestringr 即可完成这项工作。您可以修改 str_detect() 内的目标列。

这行得通吗?

library(data.table)
library(stringr)

y <- data.table('criteria1' = c('info','1','info','','info'),"criteria2.(str)" = c('y','3',''),"criteria3" = c('y','7',check.names=FALSE)

towrangle <- names( y )[str_detect( names(y),"\\(str\\)")]

y[,(towrangle) := lapply(.SD,function( x ) str_c( "\'%",x,"%\'") ),.SDcols = towrangle ]
y
#>    criteria1 criteria2.(str) criteria3
#> 1:      info           '%y%'         y
#> 2:         1           '%3%'         7
#> 3:      info            '%%'          
#> 4:                  '%info%'      info
#> 5:      info            '%%'      info

reprex package (v1.0.0) 于 2021 年 3 月 4 日创建

,

另一种data.table方法

与 Francesco 的回答基本相同(他的回答有点听话)......只有列的选择(和粘贴字符串)不同,所以不需要包 stringr..

library( data.table )
setDT(y)
cols <- grep( "\\(str\\)",names(y),value = TRUE )
#update
y[,(cols) := lapply( .SD,function(x) paste0( "%","%" ) ),.SDcols = cols ][]

#    criteria1 criteria2.(str) criteria3
# 1:      info             %y%         y
# 2:         1             %3%         7
# 3:      info              %%          
# 4:                    %info%      info
# 5:      info              %%      info