2014-01-08 2 views
1

У меня очень большой набор данных, поэтому я хочу избежать циклов.Заполнить матрицу значениями столбцов в R, используя имена и имена ростов

У меня есть три колонки данных:

col1 = время представлено как 10000, 10001, 10002, 10100, 10101, 10102, 10200 , 10201, 10202, 10300, ... (всего 18000 раз)

col2 = идентификационный номер 1 2 3 4 ... (всего 500 идентификаторов)

col3 = чтение связано с определенным идентификатором в конкретный момент времени. 0,1 0,5 0,6 0,7 ... Скажем это называется Data3

10000 1 0,1

10001 1 0,5

10002 1 0,6

10100 1 0.7

10200 1 0,6 (Примечание - некоторые случайные записи отсутствуют)

Я хочу представить это как матрицу (так называемый DataMatrix), но отсутствуют данные, поэтому простое изменение не будет выполнено. Я хочу иметь недостающие данные в качестве записей NA.

В настоящее время DataMatrix представляет собой матрицу NA из 500 столбцов и 18000 строк, где имена строк и имена столбцов являются соответственно временем и идентификаторами.

1 2 3 4 ....

10000 NA NA NA NA ....

10001 NA NA NA NA ....

Есть ли способ Я могу заставить R пройти через каждую строку Data3, завершив DataMatrix чтением Data3 [, 3], поместив его в строку и столбец матрицы, имена которых относятся к Data3 [, 1] и Data3 [, 2]. Но без петель.

Благодаря всем вам умным людям.

+2

Почему вы говорите «отсутствуют данные, поэтому простая перестановка не будет»? Вы попробовали? Что не помогло решить проблему?Если вы предоставляете (небольшой) воспроизводимый пример, демонстрирующий условия/проблемы, которые вы ожидаете, вы, скорее всего, получите значимую помощь. – A5C1D2H2I1M1N2O1R2T1

+0

Что относительно 'library (reshape2); DataMatrix <- dcast (Data3, col1 ~ col2, value.var = "col3") '? – lukeA

+0

Спасибо Ананде - ты прав - игра вокруг - это, безусловно, путь вперед. Я думал, что может быть какая-то функция соответствия или поиска, о которой я не знал. Отсутствующие данные означают, что Data3 НЕ 18000 * 500 длинный, но меньше. Следовательно, перестройка катастрофы. – user3173922

ответ

0

Если я правильно вас понял:

Data3 <- data.frame(col1=10000:10499, 
        col2=1:500, 
        col3=round(runif(500),1)) 

library(reshape2) 
DataMatrix <- dcast(Data3, col1~col2, value.var="col3") 
DataMatrix[1:5, 1:5] 
# col1 1 2 3 4 
# 1 10000 0.4 NA NA NA 
# 2 10001 NA 0.6 NA NA 
# 3 10002 NA NA 0.9 NA 
# 4 10003 NA NA NA 0.5 
# 5 10004 NA NA NA NA 
+0

Это может не работать полностью, если у вас нет данных о возможных значениях col1 и col2. Это произойдет, если это произойдет. – BrodieG

+0

Спасибо за это LukeA и BrodieG. Я сейчас пробовал и очень волнуюсь! Пальцы скрещены :) – user3173922

+0

Это круто! Большое спасибо вам, чудесные звездные звезды! **** – user3173922

1

Вот решение с возможными значениями идентификаторов в 1:10 и раз значений в 1:20. Во-первых, создать данные:

mx <- matrix(c(sample(1:20, 5), sample(1:10, 5), sample(1:50, 5)), ncol=3, dimnames=list(NULL, c("time", "id", "reading"))) 
times <- 1:20 
ids <- 1:10 
mx 
#  time id reading 
# [1,] 4 3  25 
# [2,] 5 4  9 
# [3,] 9 7  45 
# [4,] 18 1  40 
# [5,] 11 8  28 

Теперь используйте outer пройти все возможные комбинации времени/идентификатор взору до функции, которая возвращает соответствующее reading значение:

outer(times, ids, 
    function(x, y) { 
    mapply(function(x.sub, y.sub) { 
     val <- mx[mx[, 1] == x.sub & mx[, 2] == y.sub, 3] 
     if(length(val) == 0L) NA_integer_ else val 
    }, 
    x, y) 
}) 

Это производит (надеюсь) желаемый ответ:

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] NA NA NA NA NA NA NA NA NA NA 
# [2,] NA NA NA NA NA NA NA NA NA NA 
# [3,] NA NA NA NA NA NA NA NA NA NA 
# [4,] NA NA 25 NA NA NA NA NA NA NA 
# [5,] NA NA NA 9 NA NA NA NA NA NA 
# [6,] NA NA NA NA NA NA NA NA NA NA 
# [7,] NA NA NA NA NA NA NA NA NA NA 
# [8,] NA NA NA NA NA NA NA NA NA NA 
# [9,] NA NA NA NA NA NA 45 NA NA NA 
# [10,] NA NA NA NA NA NA NA NA NA NA 
# [11,] NA NA NA NA NA NA NA 28 NA NA 
# [12,] NA NA NA NA NA NA NA NA NA NA 
# [13,] NA NA NA NA NA NA NA NA NA NA 
# [14,] NA NA NA NA NA NA NA NA NA NA 
# [15,] NA NA NA NA NA NA NA NA NA NA 
# [16,] NA NA NA NA NA NA NA NA NA NA 
# [17,] NA NA NA NA NA NA NA NA NA NA 
# [18,] 40 NA NA NA NA NA NA NA NA NA 
# [19,] NA NA NA NA NA NA NA NA NA NA 
# [20,] NA NA NA NA NA NA NA NA NA NA 
Смежные вопросы