2012-01-27 3 views
6

У меня есть две таблицы, и я пытаюсь найти значения из одного для добавления к значениям в другом. В настоящее время я использую два цикла, но они работают медленно. Я новичок в R и знаю, что мне следует избегать цикла, чтобы ускорить работу, но я не могу понять, как это сделать.Поиск без цикла

Table1 (несколько тысяч строк, 37 столбцов):

type cat1 cat2 cat3 ... cat36 
    1 2 3 2   7 
    3 6 2 1   9 
    2 4 6 7   4 
    3 5 7 8   2 
    5 2 2 9   1 
    4 3 1 2   3 
    1 8 1 4   4 
...

table2 (36 строк, 5 столбцов):

  type1 type2 type3 type4 type5 
cat1  2  3  4  3  8 
cat2  8  5  5  2  6 
cat3  7  5  1  3  5 
... 
cat36  4  7  2  8  9

я хочу изменить каждое значение в табл.1, добавив соответствующее значение (соответствие между 5 типами и 36 категориями) из Таблицы 2. Вот желаемые результаты:

type cat1 cat2 cat3 ... cat36 
    1 4 11 9  11 
    3 10 7 2  11 
    2 7 11 12  11 
    3 9 12 9   4 
    5 10 8 14  10 
    4 6 3 5  11 
    1 10 9 11   8 
...

Вот мой текущий (медленный) код:

for (i in 1:36) { 
    for (j in 1:nrow(Table1)) { 
     Table1[j,i+1] = Table1[j,i+1] + Table2[i,Table1[j,1]] 
    } 
} 
+1

Хотя я использовал две петли для ясности, отмечу, что я мог бы просто имел одну петлю через ряды Table1, добавив соответствующий столбец из Table2 к каждой строке Table1 , –

ответ

4

Столбец типа в Table1 указывает, какой столбец в Table2, чтобы добавить к строк в Table1 , Поэтому в столбце «тип» в качестве индекса строк TABLE2, а затем перенести полученную матрицу таким образом Вы можете добавить строки в строки:.

Table3 <- cbind(Table1[ , "type"], 
       t(Table2[ , Table1[ , "type"] ]) + Table1[ , -1]) 

(я предполагаю, что Table1 и Table2 матрицы Если они это кадры данных, которые вы можете использовать Table1$type вместо Table1[,"type"]).

+0

Спасибо. Я получил это, чтобы работать после исправления одной опечатки. Вместо 'Table2 [Table1 [," type "],]' it должно быть 'Table2 [, Table1 [," type "]]' –

+0

К сожалению, вы правы. Я перепутал транспонирование между строками и столбцами! – Tyler

1

Я бы превратил обе таблицы в «длинные» вместо двух разных «широких» форматов. После создания обеих таблиц вы можете выполнить слияние (R data.frame analog to SQL join) в двух таблицах, а затем тривиально суммировать значения.

Вот подобный пример:

## creating some synthetic data 
df1 <- data.frame(type=sample(1:4, 100, replace=TRUE), cat1=sample(1:4, 100, replace=TRUE), cat2=sample(1:4, 100, replace=TRUE),cat3=sample(1:4, 100, replace=TRUE),cat4=sample(1:4, 100, replace=TRUE)) 
df2 <- data.frame(cat=1:4, type1=sample(1:4,4), type2=sample(1:4,4), type3=sample(1:4,4), type4=sample(1:4,4)) 

require(reshape) 

## rearrange df1 
m1 <- melt(df1, id.vars="type") 
m1$cat <- substr(m1$variable, 4,4) 
m1$variable <- NULL 

## rearrange df2 
m2 <- melt(df2, id.vars="cat") 
m2$type <- substr(m2$variable, 5, 5) 
m2$value2 <- m2$value 
m2$variable <- NULL 
m2$value <- NULL 

## now that they are laid out the same, they can be merged 
df3 <- merge(m1, m2) 
df3$newSum <- df3$value + df3$value2 
Смежные вопросы