применить предикат rename_if к именам столбцов - PullRequest
0 голосов
/ 05 января 2019

Я работаю с набором таблиц Excel, имена столбцов которых являются датами.

После считывания данных с readxl::read_xlsx() эти имена столбцов становятся датами индекса Excel (то есть целым числом, представляющим дни, прошедшие с 1899-12-30)

Возможно ли использовать dplyr::rename_if() или подобное для переименования всех имен столбцов, которые в настоящее время являются целыми числами? Я написал функцию rename_func, которую я хотел бы применить ко всем таким столбцам.

df %>% rename_if(is.numeric, rename_func) не подходит, так как is.numeric применяется к данным в столбце, а не к самому имени столбца. Я также попробовал:

is.name.numeric <- function(x) is.numeric(names(x))
df %>% rename_if(is.name.numeric, rename_func)

, который не работает и не меняет никакие имена (т.е. is.name.numeric возвращает FALSE для всех столбцов)

edit: вот фиктивная версия моих данных

df_badnames <- structure(list(Level = c(1, 2, 3, 3, 3), Title = c("AUSTRALIAN TOTAL", 
"MANAGERS", "Chief Executives, Managing Directors & Legislators", 
"Farmers and Farm Managers", "Hospitality, Retail and Service Managers"
), `38718` = c(213777.89, 20997.52, 501.81, 121.26, 4402.7), 
    `38749` = c(216274.12, 21316.05, 498.1, 119.3, 4468.67), 
    `38777` = c(218563.95, 21671.84, 494.08, 118.03, 4541.02), 
    `38808` = c(220065.05, 22011.76, 488.56, 116.24, 4609.28)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

и мне хотелось бы:

df_goodnames <- structure(list(Level = c(1, 2, 3, 3, 3), Title = c("AUSTRALIAN TOTAL", 
"MANAGERS", "Chief Executives, Managing Directors & Legislators", 
"Farmers and Farm Managers", "Hospitality, Retail and Service Managers"
), Jan2006 = c(213777.89, 20997.52, 501.81, 121.26, 4402.7), 
    Feb2006 = c(216274.12, 21316.05, 498.1, 119.3, 4468.67), 
    Mar2006 = c(218563.95, 21671.84, 494.08, 118.03, 4541.02), 
    Apr2006 = c(220065.05, 22011.76, 488.56, 116.24, 4609.28)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

Я понимаю, что лучше всего создать столбец date и изменить форму этого df, но мне нужно сначала объединить несколько электронных таблиц, и наличие целочисленных имен столбцов вызывает много проблем. В настоящее время у меня есть обходной путь, но суть моего вопроса (применить предикат rename_if к имени, а не к столбцу) по-прежнему интересна.

1 Ответ

0 голосов
/ 05 января 2019

Хотя имена выглядят числовыми, но они не

class(names(df_badnames))
#[1] "character"

, чтобы они не были перехвачены is.numeric или подобными другими функциями.

Один из способов сделать это - выяснить, какие names можно привести к числовому, а затем преобразовать их в формат даты по нашему выбору

cols <- as.numeric(names(df_badnames))
names(df_badnames)[!is.na(cols)] <- format(as.Date(cols[!is.na(cols)], 
                                          origin = "1899-12-30"), "%b%Y")

df_badnames

#  Level Title                                           Jan2006 Feb2006 Mar2006 Apr2006
#   <dbl> <chr>                                             <dbl>   <dbl>   <dbl>   <dbl>
#1     1 AUSTRALIAN TOTAL                                213778. 216274. 218564. 220065.
#2     2 MANAGERS                                         20998.  21316.  21672.  22012.
#3     3 Chief Executives, Managing Directors & Legisla…    502.    498.    494.    489.
#4     3 Farmers and Farm Managers                          121.    119.    118.    116.
#5     3 Hospitality, Retail and Service Managers          4403.   4469.   4541.   4609.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...