Инвертирование Dataframe в R - PullRequest
       14

Инвертирование Dataframe в R

0 голосов
/ 06 сентября 2018

Вот как пример. Участники оценивают свои любимые цвета между зеленым, синим и красным. id представляет участников. Каждый участник оценивал три цвета из 1-3 (лучший = 1, второй любимый = 2, наименее любимый = 3). Представьте, что данные выглядят так:

         id1      id2     id3
 rank1   red     green    blue
 rank2   green   blue     red
 rank3   blue    red      green

Мне нужно изменить значения, чтобы они выглядели так:

        id1   id2    id3
 green   2      1     3
 blue    3      2     1
 red     1      3     2 

По сути, я хочу создать строку с цветом и записать ее рейтинг. Мой фактический фрейм данных составляет 25 столбцов х 100 строк. Я делаю это, потому что ввод данных проще в версии 1.

Какой самый простой способ изменить данные?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете использовать tidyr::spread и ::gather для этого:

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
         id1      id2     id3
 rank1   red     green    blue
 rank2   green   blue     red
 rank3   blue    red      green')

library(dplyr)
library(tidyr)

dat %>%
  tibble::rownames_to_column() %>%
  gather(id, color, -rowname) %>%
  spread(id, rowname) %>%
  tibble::column_to_rownames(var="color")
#         id1   id2   id3
# blue  rank3 rank2 rank1
# green rank2 rank1 rank3
# red   rank1 rank3 rank2

(column_to_rownames предназначался исключительно для соответствия вашим спецификациям, но я не рекомендую использовать имена строк.)

При желании можно вставить команду для удаления текста rank из рядов:

dat %>%
  tibble::rownames_to_column() %>%
  mutate(rowname = gsub("\\D", "", rowname)) %>%
  gather(id, color, -rowname) %>%
  spread(id, rowname) %>%
  tibble::column_to_rownames(var="color")
#       id1 id2 id3
# blue    3   2   1
# green   2   1   3
# red     1   3   2

или даже mutate(rowname = as.integer(gsub("\\D", "", rowname))), если вы хотите, чтобы они были целыми числами.

0 голосов
/ 06 сентября 2018

sapply a match для каждого столбца вашего фрейма данных:

# example data
df <- data.frame(
    id1 = c("red", "green", "blue"),
    id2 = c("green", "blue", "red"),
    id3 = c("blue", "red", "green"),
    stringsAsFactors = FALSE
)

# create ranking dataframe
sapply(df, match, x=c("green", "blue", "red"))

Результат:

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