R: Соединить / назначить значения двух перекрывающихся наборов данных - PullRequest
1 голос
/ 06 августа 2011

Мне нужна твоя любимая помощь ...

У меня есть два набора данных.Один назначает имена людей для идентификаторов TradeID, другой назначает идентификаторы лиц (идентичные) идентификаторам TradeID.Я хочу узнать, у какого человека какой ID.

Данные:

personID    tradeID     Name    tradeID
123         10      |   Bob     7
123         5       |   Bob     8
210         1       |   Jack    3
210         7       |   Jack    11
210         8       |   Paul    5
988         11      |   Paul    10
988         8       |

Проблема:

IЯ хочу выяснить, где перекрываются / пересекаются торговые идентификаторы, поэтому я буду знать, какое имя принадлежит к какому personID.

Результат (должен выглядеть следующим образом)

personID    Name
123         Paul
210         Bob
988         Jack

Сложности:

  • Перекрытие имеет разное количество элементов (Bob & 210)
  • TradeID имеют несколько подключений к разным personIDи имена (tradeID 8)
  • Перекрытие не обязательно должно быть 100% (Jack & 988)

Идеи и испытания

  • Попробовал: библиотека сравнения фреймов данных && библиотека изменения формы (не предлагали никаких полезных методов)
  • Идея: создать векторы personID и имена && сравнить векторы (не знал, как сделать вектор) && соединить векторы с наибольшим перекрытием

Есть ли способ решить эту проблему, например, путем сравнения кадров данных?

Большое спасибо за помощь !!!

1 Ответ

0 голосов
/ 06 августа 2011

Что бы я сделал, это:

  1. Слияние двух вместе
  2. Сравните каждое имя, чтобы увидеть, соответствует ли оно более чем одному personID (плохо!)
  3. Если все получилось, отбросьте дубликаты

Так что-то вроде:

datA <- data.frame(personID=c( 123,123,210,210,210,988,988 ),tradeID=c( 10,5,1,7,8,11,8) )
datB <- data.frame(name=c("B","B","J","J","P","P"), tradeID=c( 7,8,3,11,5,10 ) )
mgd <- merge(datA,datB)
library(taRifx)
stopifnot( all( by(mgd$personID,as.factor(mgd$name),distinct) <=1 ) )
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID) )

Это не работает на stopifnot, потому что Боб связан с personID 210 и 988, что, скорее всего, является опечаткой в ​​данных вашего примера .... Если это удалено, это работает хорошо:

datA[7,"tradeID"] <- 12
mgd <- merge(datA,datB)
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID) )
result
  personID name
1      123    P
2      210    B
5      988    J
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...