我有一个简单的数据,如下所示:
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
,col3
和col4
重命名为col5
,col3_dt
和col4_dt
我知道我可以逐行更改列名称:
col5_dt
但是,如果我有数百列,我该如何高效地进行操作?
更新:
有一些很好的答案,但是我只用colnames(dt)[3] <- "col3_dt"
来代表列。如果我的列名不一致,例如col
,AIR
和BUILD
。我该怎么办?
答案 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