Проблема с преобразованием набора данных в R; создание справочной таблицы

#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!! С благодарностью