Инвертирование Dataframe в R
Вот как пример. Участники оценивают свои любимые цвета между зеленым, синим и красным. 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 ответа
sapply
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
Ты можешь использовать 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
(The 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)))
если вам нужно, чтобы они были целыми числами.