问题描述
我有一个 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.table 和stringr 即可完成这项工作。您可以修改 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