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

Р (язык программирования)

Я хотел бы преобразовать свой набор данных, содержащий номера образцов, дни лечения и концентрации (переменные); чтобы настроить его как единую матрицу, в которой ячейки заполнены только значениями концентрации. Моим выводом является таблица поиска, в которой пользователь может найти номер образца в первой строке и день в первом столбце (заголовок) и следовать им, чтобы получить концентрацию.

Это не мой набор данных (он поставляется в виде матрицы), однако я быстро сделал эти три для примера.

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. Однако они не кажутся подходящими.

Спасибо, что нашли время, чтобы помочь мне!


person Amanda    schedule 01.07.2014    source источник


Ответы (2)


Для разнообразия (и поскольку вы упомянули «изменить форму»), вот несколько вариантов (хотя вариант 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
person A5C1D2H2I1M1N2O1R2T1    schedule 02.07.2014

Старый добрый 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
person MrFlick    schedule 01.07.2014
comment
Спасибо, мистер Флик!! Очень признателен - person Amanda; 02.07.2014