Управление фреймом данных с содержимым из другого фрейма данных, аналогичного соединению SQL - PullRequest
2 голосов
/ 11 февраля 2010

Скажем, у меня есть фрейм данных с содержанием:

Trial Person Time
1     John   1.2
2     John   1.3
3     John   1.1
1     Bill   2.3
2     Bill   2.5
3     Bill   2.7

и другой фрейм данных с содержанием:

Person Offset
John   0.5
Bill   1.0

и я хочу изменить исходный кадр на основе соответствующего значения из второго. Я мог бы сделать это легко на любом другом языке или в SQL, и я уверен, что смогу справиться с использованием циклов for и что, но со всем остальным, что я вижу в R, я предполагаю, что у него есть специальный синтаксис, чтобы сделать это как -liner. Итак, если да, то как? А если нет, не могли бы вы показать, как это можно сделать с помощью циклов. На самом деле я еще не дошел до изучения циклов в R, поскольку в нем есть удивительные вещи, позволяющие просто извлекать и манипулировать любыми значениями.

Для справки, вывод будет:

Trial Person Time
1     John   0.7
2     John   0.8
3     John   0.6
1     Bill   1.3
2     Bill   1.5
3     Bill   1.7 

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010

Есть много возможностей. Вот простой, использующий merge() и простое вычитание по столбцам в увеличенном виде data.frame:

R> DF1 <- data.frame(trial=rep(1:3,2), \
                     Person=rep(c("John","Bill"), each=3), \
                     Time=c(1.2,1.3,1.1,2.3,2.5,2.7))
R> DF2 <- data.frame(Person=c("John","Bill"), Offset=c(0.5,1.0))
R> DF <- merge(DF1, DF2)
R> DF
  Person trial Time Offset
1   Bill     1  2.3    1.0
2   Bill     2  2.5    1.0
3   Bill     3  2.7    1.0
4   John     1  1.2    0.5
5   John     2  1.3    0.5
6   John     3  1.1    0.5
R> DF$NewTime <- DF$Time - DF$Offset
R> DF
  Person trial Time Offset NewTime
1   Bill     1  2.3    1.0     1.3
2   Bill     2  2.5    1.0     1.5
3   Bill     3  2.7    1.0     1.7
4   John     1  1.2    0.5     0.7
5   John     2  1.3    0.5     0.8
6   John     3  1.1    0.5     0.6
R> 
1 голос
/ 12 февраля 2010

Один лайнер:

transform(merge(d1,d2), Time=Time - Offset, Offset=NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...