Сопоставить строки данных в соответствии с двумя переменными (индексирование) - PullRequest
2 голосов
/ 02 февраля 2011

Я, по сути, пытаюсь преобразовать неорганизованные данные в длинную форму для линейного моделирования.

У меня есть 2 data.frames "rec" и "book"

Каждая строка в «book» должна быть вставлена ​​в конец нескольких строк «rec» в соответствии с двумя переменными в строке: «MRN» и «COURSE», которые совпадают.

Я пробовал следующее и его варианты безрезультатно:

i=1
newlist=list()
colnames(newlist)=colnames(book)
for ( i in 1:dim(rec)[1]) {
    mrn=as.numeric(as.vector(rec$MRN[i]));
    course=as.character(rec$COURSE[i]);
get.vector<-as.vector(((as.numeric(as.vector(book$MRN))==mrn) & (as.character(book$COURSE)==course)))
newlist[i]<-book[get.vector,] 
i=i+1;
}

Если у кого-то есть предложения по

1) заставить это работать 2) сделать его более элегантным (или, возможно, просто менее неуклюжим)

Если мне что-то неясно, прошу прощения.

Я понимаю, что я не объединил какие-либо данные выше, я думаю, что если я смогу сгенерировать данные в длинном формате. Я могу объединить их все самостоятельно

Ответы [ 2 ]

7 голосов
/ 02 февраля 2011

Похоже, вам нужно merge два кадра данных. Попробуйте это:

merge(rec, book, by = c('MRN', 'COURSE'))

и прочитайте справку для merge (выполнив ?merge на консоли R), чтобы узнать больше о способах их объединения.

2 голосов
/ 02 февраля 2011

Я создал простой пример, который может вам помочь.В моем случае я хотел вставить столбец 'value' из df1 в каждую строку df2, в соответствии с переменными x1 и x2:

df1 <- read.table(textConnection("
x1 x2 value
1 2 12
1 3 56
2 1 35
2 2 68
"),header=T)

df2 <- read.table(textConnection("
test x1 x2
1 1 2
2 1 3
3 2 1
4 2 2
5 1 2
6 1 3
7 2 1
"),header=T)

library(sqldf)
sqldf("select df2.*, df1.value from df2 join df1 using(x1,x2)")

  test x1 x2 value
1    1  1  2    12
2    2  1  3    56
3    3  2  1    35
4    4  2  2    68
5    5  1  2    12
6    6  1  3    56
7    7  2  1    35
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...