Объединение столбцов из разных фреймов данных - PullRequest
2 голосов
/ 06 января 2012

У меня проблема ....

У меня есть два кадра данных

>anna1
     name   from       to        result
     11     66607     66841       0
     11     66846     67048       0
     11     67053     67404       0
     11     67409     68216       0
     11     68221     68786       0
     11     68791     69020       0
     11     69025     69289       0
     11     69294     70167       0
     11     70172     70560       0

и второй фрейм данных

>anna2
     name   from      to       result
     11     66607     66841       5
     11     66846     67048       6 
     11     67409     68216       7
     11     69025     69289       12
     11     70172     70560       45

Я хочу создать новый фрейм данных, аналогичный anna1, где все значения 0 будут заменены правильными результатами в правильной строке из anna2

вы заметите, что во фрейме данных anna2 в столбцах from и to есть только некоторые одинаковые значения с соответствующими значениями во фрейме данных anna1 .... промежуточное звено отсутствует

Так что мне нужно каким-то образом взять числа из столбца результатов в anna2 и поместить их в правильный ряд в anna1

заранее спасибо

С наилучшими пожеланиями Anna

Ответы [ 4 ]

2 голосов
/ 06 января 2012

Проще merge:

anna3 <-merge(anna2,anna1[,1:3], all.y=TRUE)
anna3[is.na(anna3)] <- 0

Дает:

> anna3
  name  from    to result
1   11 66607 66841      5
2   11 66846 67048      6
3   11 67053 67404      0
4   11 67409 68216      7
5   11 68221 68786      0
6   11 68791 69020      0
7   11 69025 69289     12
8   11 69294 70167      0
9   11 70172 70560     45
1 голос
/ 06 января 2012

Другой подход

require(plyr)
anna <- rbind(anna1, anna2)
ddply(anna, .(name, from, to), summarize, result = sum(result))

РЕДАКТИРОВАТЬ.Если кадры данных большие, а скорость - проблема, подумайте об использовании data.table

require(data.table)
data.table(anna)[,list(result = sum(result)),'name, from, to']
1 голос
/ 06 января 2012

Если столбец «from» гарантированно будет уникальным как в anna1, так и в anna2, И в каждой строке в anna2 есть совпадающая строка в anna1 (хотя и не наоборот), простое решение -

row.index = function(d) which(anna1$from == d)[1]
indices = sapply(anna2$from, row.index)
anna1$result[indices] = anna2$result
0 голосов
/ 06 января 2012

Вы можете использовать merge, но вы должны явно указать, что следует делать с двумя result столбцами.

d <- merge(anna1, anna2, by=c("name",  "from", "to"), all=TRUE)
d$result <- ifelse(d$result.x == 0 & !is.na( d$result.y ), d$result.y, d$result.x)
d <- d[,c("name", "from", "to", "result")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...