我有一个数据集,其中包括一堆与我要制作成各种前缀后缀的变量。数据集还包含一些没有任何后缀的变量。喜欢的东西:setNames后缀前缀
df <- data.frame(
home_loc = rnorm(5),
work_loc = rnorm(5),
x1 = rnorm(5),
walk_act = rnorm(5),
bike_act = rnorm(5),
x2 = rnorm(5),
happy_yest = rnorm(5),
sad_yest = rnorm(5)
)
我能想出以下解决方案:
suff_to_pre <- function(x, suffix, prefix) {
for (i in seq_along(names(x))) {
if (grepl(suffix, names(x)[i])) {
names(x)[i] <- sub(suffix, "", names(x)[i])
names(x)[i] <- paste0(prefix, names(x)[i])
}
}
names(x)
}
names(df) <- suff_to_pre(df, suffix = "_loc", prefix = "loc_")
names(df) <- suff_to_pre(df, suffix = "_act", prefix = "act_")
names(df) <- suff_to_pre(df, suffix = "_yest", prefix = "yest_")
names(df)
[1] "loc_home" "loc_work" "x1" "act_walk" "act_bike" "x2" "yest_happy"
[8] "yest_sad"
但是,我感觉不很满意。具体来说,我真的很喜欢使用dplyr获得相同结果的方法。 I found this和this,该拉去:
a <- df %>%
select(ends_with("_loc")) %>%
setNames(sub("_loc", "", names(.))) %>%
setNames(paste0("loc_", names(.)))
b <- df %>%
select(ends_with("_act")) %>%
setNames(sub("_act", "", names(.))) %>%
setNames(paste0("act_", names(.)))
c <- df %>%
select(ends_with("_yest")) %>%
setNames(sub("_yest", "", names(.))) %>%
setNames(paste0("yest_", names(.)))
df <- cbind(
select(df, x1, x2), a, b, c
)
这显然是不理想的。我希望有人提出使用dplyr更优雅的解决方案。
编辑
@docendo discimus和@ zx8754了真正有用的答案,但我应该更加明确。我也有包含下划线的变量,但不是我想更改为前缀的后缀。
为例(见下free_time):
df <- data.frame(
home_loc = rnorm(5),
work_loc = rnorm(5),
x_1 = rnorm(5),
walk_act = rnorm(5),
bike_act = rnorm(5),
x_2 = rnorm(5),
happy_yest = rnorm(5),
sad_yest = rnorm(5),
free_time = rnorm(5)
)
意想不到的答案用这个,但是我本来应该更明确。我也有包含下划线的变量,但不是我想更改为前缀(例如,free_time)的后缀。 –
这个答案非常明确且有帮助。谢谢。显然我需要学习正则表达式。 –