Словарь заголовков в R - PullRequest
0 голосов
/ 27 ноября 2018

Есть ли способ, которым я могу хранить отдельный список заголовков, который в основном действует как словарь, в котором содержится описательный заголовок, а затем более простое в использовании короткое имя для каждого заголовка, который я мог бы вызывать взад и вперед без необходимости поддерживатьправильный порядок столбцов?Я не очень хорош в этом, но вот пример того, о чем я думал:

Исходный набор данных

|---------------------|------------------|------------------|
|    Descriptive A    |  Descriptive B   |  Descriptive C   |
|---------------------|------------------|------------------|
|          12         |         34       |       25         |
|---------------------|------------------|------------------|

Словарь заголовков

|---------------------|------------------|
|      long_name      |    short_name    |
|---------------------|------------------|
|      Descriptive A  |         A        | 
|---------------------|------------------|
|      Descriptive B  |         B        | 
|---------------------|------------------|
|      Descriptive C  |         C        | 
|---------------------|------------------|

Тогда яможет иметь фрагмент кода, который вызывает столбец short_name словаря для замены заголовка long_name заголовка на short_name, и тогда мне не придется полагаться на положение заголовков.

Я неконечно, если это возможно, но у меня есть таблица с 180 столбцами (которая растет), и у них всех есть описательные имена, которые плохо переводятся в R, поэтому я подумал, что это может быть решением, которое я мог бы продолжить добавлять в качестве данныхнабор растет.

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

Вы можете дать names имена, а затем установить подмножество names перед тем, как подмножество data.frame.

Например, используя данные диафрагмы:

short_names <- names(iris)
names(short_names) <- c("sl","sw","pl","pw","sp")
attributes(iris)$names <- short_names

head(iris[names(iris)[c("sl","sp")]])
  Sepal.Length Species
1          5.1  setosa
2          4.9  setosa
3          4.7  setosa
4          4.6  setosa
5          5.0  setosa
6          5.4  setosa
0 голосов
/ 27 ноября 2018

Как я уже говорил, я не думаю, что есть способ сделать алиасинг вместо , но для расчета вы можете сделать что-то вроде:

df1 <- data.frame(
  "Descriptive A" = 12,
  "Descriptive B" = 34,
  "Descriptive C" = 25,
  check.names = FALSE
)

Объект "алиасинг"может быть фреймом, но так как все, что вы делаете - присваиваете имя имени, оно эффективно обрабатывается именованным character вектором:

df1_aliases <- c(
  "B" = "Descriptive B",
  "A" = "Descriptive A",
  "C" = "Descriptive C"
)

Ваши шаги псевдонимов были бы преднамеренными/ post-translation для имен:

names(df1) <- names(df1_aliases)[ match(names(df1), df1_aliases) ]
df1
#    A  B  C
# 1 12 34 25

### do stuff here ###

names(df1) <- df1_aliases[ match(names(df1), names(df1_aliases)) ]
df1
#   Descriptive A Descriptive B Descriptive C
# 1            12            34            25

Может быть целесообразно перезаписать $.data.frame и $<-.data.frame для базовых операций со знаком доллара, но вам также необходимо перезаписать [.data.frame, [[.data.frame и, возможно, даже with (в зависимости от ваших привычек доступа к кадрам) ... и эти переписанные функции могут не работать со всеми другими функциями, которые вы используете (в зависимости от пути поиска их функции / пространства имен).

Из-за сложности отслеживания всего, что касается фрейма, я настоятельно рекомендую вам сделать это как можно более явным: иметь только один набор имен, по которым известен каждый столбец (будь то оригинал или ваши псевдонимы), никогдаоба одновременно.Это означает, что шаги перевода / перевода не являются явными, и все, что работает с кадром, будет работать однозначно.

0 голосов
/ 27 ноября 2018

Используя dict и DF, определенные в примечании, в конце запустите показанный цикл for, а затем мы можем использовать A, B и C без кавычек в качестве имен столбцов.

for(i in 1:nrow(dict)) assign(dict$short_name[i], dict$long_name[i])

# test - use DF[B] in place of DF["Descriptive B"]
DF[B]
##   Descriptive B
## 1            34

Как показано в приведенном выше тесте, он прост при использовании обычной подписки.Если вы хотите использовать нестандартную оценку, такую ​​как в dplyr, тогда вам нужно будет использовать rlang обычным способом:

library(dplyr)

DF %>% mutate(D = !!sym(B))
##   Descriptive A Descriptive B Descriptive C  D
## 1            12            34            25 34

Примечание

Мы предполагаем, что этот ввод:

Lines1 <- "
      long_name      |    short_name
      Descriptive A  |         A     
      Descriptive B  |         B     
      Descriptive C  |         C" 
dict <- read.table(text = Lines1,  header = TRUE, sep = "|", as.is = TRUE, 
  strip.white = TRUE)

Lines2 <- "
    Descriptive A    |  Descriptive B   |  Descriptive C 
          12         |         34       |       25"
DF <- read.table(text = Lines2,  header = TRUE, sep = "|", as.is = TRUE,
   strip.white = TRUE, check.names = FALSE)
0 голосов
/ 27 ноября 2018

Да, вам просто нужен словарь (или кодовая книга) как отдельный фрейм данных (может быть считан, скажем, из файла .csv).Допустим, у вас есть фрейм данных, подобный этому:

df <- data.frame(matrix(rnorm(1000), ncol = 100))
names(df) <- paste0("a very long unfortunate name to be replaced_", 1:ncol(df))

Вы можете создать кодовую книгу следующим образом:

codebook <- data.frame(long_name = names(df), short_name = paste0("X_", 1:ncol(df)),
                       stringsAsFactors = F)

                                      long_name short_name
1 a very long unfortunate name to be replaced_1        X_1
2 a very long unfortunate name to be replaced_2        X_2
3 a very long unfortunate name to be replaced_3        X_3
4 a very long unfortunate name to be replaced_4        X_4
5 a very long unfortunate name to be replaced_5        X_5
6 a very long unfortunate name to be replaced_6        X_6

Давайте затем изменим имена df, используя «короткие имена»

names(df) <- codebook[ ,2]

Для забавы давайте рандомизируем строки codebook, чтобы показать, что вы все еще можете использовать его:

codebook <- codebook[sample(nrow(codebook)), ]

Наконец, вы можете использовать match() для получения оригинальных длинных имен:

codebook$long_name[match(names(df), codebook$short_name)]

  [1] a very long unfortunate name to be replaced_1   a very long unfortunate name to be replaced_2  
  [3] a very long unfortunate name to be replaced_3   a very long unfortunate name to be replaced_4  
  [5] a very long unfortunate name to be replaced_5   a very long unfortunate name to be replaced_6  
  [7] a very long unfortunate name to be replaced_7   a very long unfortunate name to be replaced_8  
  [9] a very long unfortunate name to be replaced_9   a very long unfortunate name to be replaced_10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...