Изменение нескольких имен переменных по заданному шаблону c - PullRequest
1 голос
/ 03 февраля 2020

У меня есть набор данных с сотнями переменных, который выглядит примерно так

dt <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,1,2,1,2,1,2,1), dp_eu_ = rnorm(9), EU_top = rnorm(9), fr_dp_us_ = rnorm(9), us = rnorm(9), c= rnorm(9), dp_eu_fit= rnorm(9))
dt
# id time     dp_eu_      EU_top      dp_us_          us            c  dp_eu_fit
# 1  1    1 -1.1184009 -1.07430118  0.61398523 -0.68343624 -0.050577369  0.2849573
# 2  1    2  0.4347047 -0.53454071 -0.30716538 -1.02328242  0.626537910  0.7790181
# 3  1    1  0.2318315 -0.05854228  0.05169733 -0.22130149 -0.224553878  1.5612293
# 4  2    2  1.2640080  2.07899296 -0.95918953 -0.35961156  0.839223862  0.5001897
# 5  2    1 -0.4374764 -0.25284854 -0.46251901  0.08630344  1.749488237  0.7155184
# 6  2    2  0.5042690  0.13322671  1.00881113  0.43807458 -0.007357072  0.5086272
# 7  3    1  0.3672216  1.92995242  0.48708183  0.58206127  0.112447259 -0.4707959
# 8  3    2 -1.5431709  0.53362731  1.17361087 -1.00932195 -0.125171990  0.8641184
# 9  3    1 -1.4577268  0.23413541 -0.32399489 -0.91040641  1.995611848  1.3348043

Я хотел бы изменить имя моих переменных по следующим критериям: если имя имени переменной содержит dp_ тогда eu и us должны быть прописными буквами, EU и US соответственно. В противном случае имя должно остаться прежним

Я знаю, как менять имена переменных по одному, но, учитывая, что у меня есть сотни переменных, эту операцию следует систематизировать.

Окончательный набор данных должен выглядеть примерно так

f.dt <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,1,2,1,2,1,2,1), dp_EU_ = rnorm(9), EU_top = rnorm(9), fr_dp_US_ = rnorm(9), us = rnorm(9), c= rnorm(9), dp_EU_fit= rnorm(9))
f.dt
# id time     dp_EU_      EU_top      fr_dp_US_     us            c      dp_EU_fit
# 1  1    1 -1.1184009 -1.07430118  0.61398523 -0.68343624 -0.050577369  0.2849573
# 2  1    2  0.4347047 -0.53454071 -0.30716538 -1.02328242  0.626537910  0.7790181
# 3  1    1  0.2318315 -0.05854228  0.05169733 -0.22130149 -0.224553878  1.5612293
# 4  2    2  1.2640080  2.07899296 -0.95918953 -0.35961156  0.839223862  0.5001897
# 5  2    1 -0.4374764 -0.25284854 -0.46251901  0.08630344  1.749488237  0.7155184
# 6  2    2  0.5042690  0.13322671  1.00881113  0.43807458 -0.007357072  0.5086272
# 7  3    1  0.3672216  1.92995242  0.48708183  0.58206127  0.112447259 -0.4707959
# 8  3    2 -1.5431709  0.53362731  1.17361087 -1.00932195 -0.125171990  0.8641184
# 9  3    1 -1.4577268  0.23413541 -0.32399489 -0.91040641  1.995611848  1.3348043

Заранее большое спасибо за вашу помощь

С уважением

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Мы можем использовать rename_at. Укажите имена столбцов, которые starts_with 'dp', используйте sub, чтобы захватить 'eu | us' в качестве группы захвата, при замене укажите обратную ссылку (\\1) захваченной группы и преобразуйте ее в верхний регистр (\\U)

library(dplyr)
dt %>%
   rename_at(vars(starts_with('dp')),
            ~sub("_(eu|us)", "_\\U\\1", ., perl = TRUE))
#  id time     dp_EU_     EU_top      dp_US_          US           c   dp_EU_fit
#1  1    1  0.4978505 -1.6866933  0.82158108  2.16895597 -0.04287046 -0.50232345
#2  1    2 -1.9666172  0.8377870  0.68864025  1.20796200  1.36860228 -0.33320738
#3  1    1  0.7013559  0.1533731  0.55391765 -1.12310858 -0.22577099 -1.01857538
#4  2    2 -0.4727914 -1.1381369 -0.06191171 -0.40288484  1.51647060 -1.07179123
#5  2    1 -1.0678237  1.2538149 -0.30596266 -0.46665535 -1.54875280  0.30352864
#6  2    2 -0.2179749  0.4264642 -0.38047100  0.77996512  0.58461375  0.44820978
#7  3    1 -1.0260044 -0.2950715 -0.69470698 -0.08336907  0.12385424  0.05300423
#8  3    2 -0.7288912  0.8951257 -0.20791728  0.25331851  0.21594157  0.92226747
#9  3    1 -0.6250393  0.8781335 -1.26539635 -0.02854676  0.37963948  2.05008469

Или используя sub из base R

names(dt) <-  sub("^(dp)_(eu|us)", "\\1_\\U\\2", names(dt), perl = TRUE)
1 голос
/ 03 февраля 2020

Это также работает, используя colnames, gsub и позитивный взгляд (?<=dp):

colnames(dt) <- gsub("(?<=dp)(_eu|_us)", "\\U\\1", colnames(dt), perl = T)
dt
  id time      dp_EU_     EU_top  fr_dp_US_         us          c  dp_EU_fit
1  1    1 -0.81669215  1.8495535  1.8154587  0.6043386 -0.6180818 -0.5345326
2  1    2 -0.83873881  0.3983787 -0.3831486  0.6805642 -1.9742056 -1.2957808
3  1    1  0.33924119 -0.7765386 -0.7978222 -0.9187430 -0.4307302  3.5041409
4  2    2  0.54325872 -0.9724838 -0.9929366  0.3499868 -0.5878085  1.5357091
5  2    1  0.47390222 -0.1459549 -1.7888378  1.3228387 -0.5570240 -1.0938662
6  2    2  1.23639314  1.5966865  1.1716568  0.9914424 -1.7479692  0.1513320
7  3    1 -0.81406599  1.0443428 -0.8080124  0.3028454 -0.3224293 -1.7845363
8  3    2  0.03811028 -2.3747454 -0.6906195 -0.8206572 -1.5255060 -0.4781954
9  3    1  1.00368529 -0.1728399 -0.9786698  0.2676469 -1.0796067 -0.8346382 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...