我正在尝试为data.frame中的每个变量名添加一个公共前缀.例如,使用mtcars数据,我可以添加前缀"cars".使用以下代码:
> data(mtcars)
> names(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs"
[9] "am" "gear" "carb"
> names(mtcars) <- paste0("cars.", names(mtcars))
> names(mtcars)
[1] "cars.mpg" "cars.cyl" "cars.disp" "cars.hp"
[5] "cars.drat" "cars.wt" "cars.qsec" "cars.vs"
[9] "cars.am" "cars.gear" "cars.carb"
Run Code Online (Sandbox Code Playgroud)
但是,我想%>%使用一些dplyr语法将其作为管道操作的一部分(即,使用串联的一系列函数).这似乎是一些组合rename和everything()应该做的伎俩,但我不知道如何让它工作.有没有人有任何想法?
Kon*_*lph 22
的确,你可以使用rename_(NSE rename本身不起作用):
data %>% rename_(.dots = setNames(names(.), paste0('cars.', names(.))))
Run Code Online (Sandbox Code Playgroud)
......老实说,为什么?只是直接分配名称更短,更易读:
data %>% setNames(paste0('cars.', names(.)))
Run Code Online (Sandbox Code Playgroud)
jig*_*jer 11
最新的解决方案 (2020) 似乎使用了rename_with,它在dplyr1.0.0 及更高版本中可用:
mtcars %>% rename_with(.fn = ~ paste0("Myprefix_", .x, "_Mypostfix")) -> mtcars.custom
Run Code Online (Sandbox Code Playgroud)
使用.cols = 参数指定变量的子集,默认为everything()。
对于未来的读者,dplyr现在可以用做这个select_if,select_at和select_all功能:
dplyr::select_all(mtcars, .funs = funs(paste0("cars.", .)))
Run Code Online (Sandbox Code Playgroud)
dplyr 现在需要列表并会抛出警告:
Warning message:
funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas:
# Simple named list:
list(mean = mean, median = median)
# Auto named with `tibble::lst()`:
tibble::lst(mean, median)
# Using lambdas
list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式解决此示例:
Warning message:
funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas:
# Simple named list:
list(mean = mean, median = median)
# Auto named with `tibble::lst()`:
tibble::lst(mean, median)
# Using lambdas
list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2019-07-31 创建
另一种dplyr解决方案:
我觉得最简单的用dplyr rename_all,rename_at,rename_if从v.1.0.4.已经被取代由rename_with...
试试这个重命名所有列名:
mtcars %>% rename_all(function(x){paste0("cars.", x)}) # older dplyr versions
mtcars %>% rename_with(everything(), function(x){paste0("cars.", x)}) # v.1.0.4.
Run Code Online (Sandbox Code Playgroud)
试试这个重命名“一些”列名:
mtcars %>% rename_at(vars(hp:wt) ,function(x){paste0("cars.", x)}) # older dplyr versions
mtcars %>% rename_with(.cols = hp:wt, function(x){paste0("cars.", x)}) # v.1.0.4.
Run Code Online (Sandbox Code Playgroud)