Переименовать несколько столбцов на основе индекса CSV-файла в R - PullRequest
0 голосов
/ 18 апреля 2020

Допустим, у меня есть фрейм данных с около 150 переменными, которые мне нужно изменить их имена, на основе отдельного файла CSV («индекс»). Порядок переменных различается между фреймом данных и индексом, и, что еще хуже, есть некоторые переменные, которые могут отсутствовать в индексе и наоборот.

Существует ли элегантный способ или пакет, который можете помочь мне сделать это?

Вот пример данных, с которыми я имею дело.

library(dplyr)
library(tibble)

##My original data frame

orig <- tribble(
~item,     ~protein,    ~carbohydrates,    ~total_fat,       ~energy,    ~zinc,
1,        5.4,        10.6,             7.3,             90,        3.4,  
2,        10.3,       11.6,             3.3,             10,        2.1, 
3,        8.4,        10.6,             2.3,             52,        0.2,
4,        2.7,        8.6,              20.3,            356,       1.3)

##New names index

csv_nm <- tribble(
  ~new_name,   ~old_name,
  "nut203",    "protein",
  "nut204",    "total_fat",
  "nut205",    "carbohydrates",
  "nut208",    "energy",
  "nut303",    "iron") 

Я пытался использовать векторы, как любезно предложено Питером:

## create a named vector to use with dplyr::rename

nm_vec <- csv_nm$old_name
names(nm_vec) <- csv_nm$new_name

## rename, subsetting the named vector to exclude names which are not present in the dataframe 

tib_new_names <- 
  orig %>% 
  rename(nm_vec[nm_vec %in% names(orig)]) 

Но получил ошибку "Все аргументы должны быть названы".

1 Ответ

0 голосов
/ 18 апреля 2020

Посмотрите, поможет ли это.

Я адаптировал ваши данные.


library(dplyr)
library(tibble)

orig <- tribble(
~item,     ~protein,    ~carbohydrates,    ~total_fat,       ~energy,    ~zinc,
1,        5.4,        10.6,             7.3,             90,        3.4,  
2,        10.3,       11.6,             3.3,             10,        2.1, 
3,        8.4,        10.6,             2.3,             52,        0.2,
4,        2.7,        8.6,              20.3,            356,       1.3)


csv_nm <- tribble(
  ~new_name,   ~old_name,
  "nut203",    "protein",
  "nut204",    "total_fat",
  "nut205",    "carbohydrates",
  "nut208",    "food_energy",
  "nut303",    "iron")

# create a named vector to use with dplyr::rename

nm_vec <- csv_nm$old_name
names(nm_vec) <- csv_nm$new_name

# rename, subsetting the named vector to exclude names which are not present in the dataframe 

tib_new_names <- 
  orig %>% 
  rename(nm_vec[nm_vec %in% names(orig)])


Что дает вам:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...