#r #matrix #reshape #transpose #lookup-tables
#r #матрица #изменить #транспонировать #таблицы поиска
Вопрос:
R (язык программирования)
Я хотел бы преобразовать свой набор данных, содержащий номера образцов, дни обработки и концентрации (переменные); чтобы настроить его как единый матрица, где ячейки заполняются только значениями концентрации. Мой вывод представляет собой таблицу поиска, где пользователь может найти номер выборки в 1-й строке и день в первом столбце (заголовок) и следовать им, чтобы получить концентрацию.
Это не мой набор данных (он поставляется в виде матрицы), однако я быстро создал эти три для примера.
Samplenb - < c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
Day <- c(1,5,10,15,1,5,10,15,1,5,10,15,1,5,10,15)
Concentration <- c(0.2, 0.3, 0.5, 0.9,0.2, 0.3, 0.5, 0.9,0.2, 0.3, 0.5, 0.9,0.2, 0.3, 0.5, 0.9)
Любая помощь очень ценится. Я играл с функциями пакета reshape. Однако они не кажутся подходящими.
Спасибо, что нашли время, чтобы помочь мне!
Ответ №1:
Для разнообразия (и поскольку вы упомянули «изменить форму»), вот несколько вариантов (хотя MrFlick, безусловно, является наиболее подходящим).
Первые два варианта предполагают, что мы сгруппировали ваши векторы в data.frame
:
DF <- data.frame(Samplenb, Day, Concentration)
Вариант 1: reshape
reshape(DF, direction = "wide", idvar = "Day", timevar = "Samplenb")
# Day Concentration.1 Concentration.2 Concentration.3 Concentration.4
# 1 1 0.2 0.2 0.2 0.2
# 2 5 0.3 0.3 0.3 0.3
# 3 10 0.5 0.5 0.5 0.5
# 4 15 0.9 0.9 0.9 0.9
Вариант 2: dcast
из «reshape2»
library(reshape2)
dcast(DF, Day ~ Samplenb, value.var="Concentration")
# Day 1 2 3 4
# 1 1 0.2 0.2 0.2 0.2
# 2 5 0.3 0.3 0.3 0.3
# 3 10 0.5 0.5 0.5 0.5
# 4 15 0.9 0.9 0.9 0.9
Вариант 3: ручной подход — должен быть быстрым, но если вы не мазохист-программист, лучше оставить в качестве урока индексирования матрицы в R.
Nrow <- unique(Day)
Ncol <- unique(Samplenb)
M <- matrix(0, nrow = length(Nrow), ncol = length(Ncol),
dimnames = list(Nrow, Ncol))
M[cbind(match(Day, rownames(M)), match(Samplenb, colnames(M)))] <- Concentration
# 1 2 3 4
# 1 0.2 0.2 0.2 0.2
# 5 0.3 0.3 0.3 0.3
# 10 0.5 0.5 0.5 0.5
# 15 0.9 0.9 0.9 0.9
Ответ №2:
Здесь может помочь старый добрый xtabs
xtabs(Concentration ~ Day Samplenb)
приведет к
Samplenb
Day 1 2 3 4
1 0.2 0.2 0.2 0.2
5 0.3 0.3 0.3 0.3
10 0.5 0.5 0.5 0.5
15 0.9 0.9 0.9 0.9
Комментарии:
1. Спасибо, MrFlick!! С благодарностью