Манипулирование кадром данных содержимы
Вопрос
Скажем, у меня есть кадр данных с содержанием:
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, и я уверен, что смог бы использовать для петли и что, но со всем остальным я вижу в R, я предполагаю, что у него есть специальный синтаксис, чтобы сделать это как один -Линнер. Итак, если так, как? И если нет, не могли бы вы показать, как это можно сделать, используя петли. Я на самом деле еще не пришел к тому, чтобы изучить цикл в 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
Решение
Есть много возможностей. Вот простой, использующий 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>
Другие советы
Один лайнер:
transform(merge(d1,d2), Time=Time - Offset, Offset=NULL)