用特定的单词重命名多个列名

时间:2019-01-24 19:05:40

标签: r rename data-manipulation

我有一个简单的数据,如下所示:

private fun buildNotification(): Notification {
    val builder = NotificationCompat.Builder(
        this@AudioPlayerService,
        getString(R.string.notification_channel_id)
    ).apply {
    ...
    addAction(
        NotificationCompat.Action(
            R.drawable.ic_replay_10,
            getString(R.string.rewind),
            MediaButtonReceiver.buildMediaButtonPendingIntent(
                this@AudioPlayerService,
                PlaybackStateCompat.ACTION_REWIND
            )
        )
    ...
    )
    return builder.build()
}

我想将我的列重命名为:

# dt
NAME  ID  col3   col4   col5
AAA    1   10     20     15
BBB    3   40     20     30
CCC    6   100   200    150

# dt NAME ID col3_dt col4_dt col5_dt AAA 1 10 20 15 BBB 3 40 20 30 CCC 6 100 200 150 col3col4重命名为col5col3_dtcol4_dt

我知道我可以逐行更改列名称:

col5_dt

但是,如果我有数百列,我该如何高效地进行操作?

更新:
有一些很好的答案,但是我只用colnames(dt)[3] <- "col3_dt" 来代表列。如果我的列名不一致,例如colAIRBUILD。我该怎么办?

3 个答案:

答案 0 :(得分:3)

您可以使用regex,例如

ind <- grepl('col\\d+', names(dt))
names(dt)[ind] <- paste0(names(dt)[ind], '_dt')
# or
names(dt) <- sub('^(col\\d+)$', '\\1_dt', names(dt), perl = TRUE)

修改

# Case 1: Exact matches
ind <- names(dt) %in% c('AIR','BUILD','LEASE')
# Case 2: names are of the form 'AIR2', 'BUILD5', etc. 
pat <- paste(paste0(c('AIR','BUILD','LEASE'), '\\d+'), collapse = '|')
ind <- grepl(pat, names(dt), perl = TRUE)  
# Either way then
names(dt)[ind] <- paste0(names(dt)[ind], '_dt')

答案 1 :(得分:3)

你可以

sw <- startsWith(names(dt), "col")
names(dt)[sw] <- paste0(names(dt)[sw], "_dt")
dt
#   NAME ID col3_dt col4_dt col5_dt
# 1  AAA  1      10      20      15
# 2  BBB  3      40      20      30
# 3  CCC  6     100     200     150

您还可以使用ifelse()进行单线处理。

ifelse(startsWith(names(dt), "col"), paste0(names(dt), "_dt"), names(dt))
# [1] "NAME"    "ID"      "col3_dt" "col4_dt" "col5_dt"

对于更新后的问题,您可以使用%in%惯用语代替sw,如@nate的答案所示。

答案 2 :(得分:1)

我们可以使用pacman -S mingw-w64-i686-glew

rename_at

数据

library(tidyverse)
df1 %>% 
   rename_at(vars(matches("col")), ~ paste0(.x, "_dt"))
#  NAME ID col3_dt col4_dt col5_dt
#1  AAA  1      10      20      15
#2  BBB  3      40      20      30
#3  CCC  6     100     200     150