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

f45qwnt8  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个df,我想创建一个函数,如果columnname包含一个特定的characterica,例如'(str)',该函数可以读取和修改整个列。如果columnname包含'(str)',我想在整个列的值的前后粘贴“' %”和“%'”

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

预期结果是:

y1<- data.frame('criteria1' = c('info','1', 'info', '', 'info'), "criteria2.(str)" = c("'%y%'","'%3%'", "'%%'", "'%info%'", "'%%'"), "criteria3" = c('y','7', '', 'info', '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)'), 
                             paste0("'%",x,"%'"),  x))

与sapply“%x%”一起水平添加,但不是为列添加

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

提前感谢!

3df52oht

3df52oht1#

使用data.tablestringr就可以完成这项工作。您可以修改str_detect()中的目标列。
这个管用吗?

library(data.table)
library(stringr)

y <- data.table('criteria1' = c('info','1', 'info', '', 'info'), 
               "criteria2.(str)" = c('y','3', '', 'info', ''), 
               "criteria3" = c('y','7', '', 'info', 'info'), 
               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

创建于2021-03-04由reprex package(v1.0.0)

ujv3wf0j

ujv3wf0j2#

另一种data.table方法
基本上与Francesco的答案相同(他的答案有点sonner)...只有列的选择(和粘贴字符串)不同,所以不需要包stringr

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

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

相关问题