如何使用dplyr为多个变量名添加前缀?

Jak*_*her 12 r dplyr

我正在尝试为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语法将其作为管道操作的一部分(即,使用串联的一系列函数).这似乎是一些组合renameeverything()应该做的伎俩,但我不知道如何让它工作.有没有人有任何想法?

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)

  • 不过, `setNames(cars, Paste0("cars.", names(cars))` 是有效的。再次感谢。 (2认同)

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()


Jak*_*her 9

对于未来的读者,dplyr现在可以用做这个select_if,select_atselect_all功能:

dplyr::select_all(mtcars, .funs = funs(paste0("cars.", .)))
Run Code Online (Sandbox Code Playgroud)


JD *_*ong 5

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 创建


T. *_*Lee 5

另一种dplyr解决方案:

我觉得最简单的用dplyr rename_allrename_atrename_ifv.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)