R:如何使用列名中的信息修改 df 中的整个列
R: How to use info from column name to modify whole column in a df
我有一个 df,我想创建一个函数来读取和修改整列,如果列名包含特定的特征,例如。 '(海峡)'。如果列名包含“(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))
with sapply '%x%' 水平添加,但不是针对列
y <- sapply(1:ncol(y), function(x)
ifelse(colnames(y) %like% ('.(str)'), paste0("'%",x,"%'"), 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', '', '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
由 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( "%", x, "%" ) ), .SDcols = cols ][]
# criteria1 criteria2.(str) criteria3
# 1: info %y% y
# 2: 1 %3% 7
# 3: info %%
# 4: %info% info
# 5: info %% info
我有一个 df,我想创建一个函数来读取和修改整列,如果列名包含特定的特征,例如。 '(海峡)'。如果列名包含“(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))
with sapply '%x%' 水平添加,但不是针对列
y <- sapply(1:ncol(y), function(x)
ifelse(colnames(y) %like% ('.(str)'), paste0("'%",x,"%'"), 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', '', '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
由 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( "%", x, "%" ) ), .SDcols = cols ][]
# criteria1 criteria2.(str) criteria3
# 1: info %y% y
# 2: 1 %3% 7
# 3: info %%
# 4: %info% info
# 5: info %% info