Использование переменных из двух наборов данных разных размеров (и логических отношений) для создания новой переменной - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть два кадра данных.Количество наблюдений очень разное, и я хотел бы использовать некоторую информацию из одного кадра данных в другой, обусловливая некоторые логические отношения, и я не могу этого сделать.Уменьшенный пример будет выглядеть примерно так:

year <- as.vector(c(rep(1949,5), rep(1950,5), rep(1951,5), rep(1952,5)))
moneyband <- as.vector(c(rep(c(10,20,30,40,50),4)))
rate <-as.vector(c(rep(c(0.1,0.2,0.3,0.4,0.5),2),rep(c(0.15,0.25,0.35,0.45,0.55),2)))

datasmall <- as.data.frame(cbind(year,moneyband,rate))

yearbig <- as.vector(c(rep(1949,10), rep(1950,10), rep(1951,10), rep(1952,11)))
earnings <- as.vector(c(rep(c(9,19,30,39,50),8),60))

databig <- as.data.frame(cbind(yearbig,earnings))

Теперь я хочу создать новую переменную в большой базе данных (назовем ее ratebig), которая присваивает этой переменной скорость, связанную с этим количествомзаработок, если заработок (в большой базе данных) равен денежному диапазону (в небольшой базе данных) за данный год.Как вы можете видеть, в этом примере это произошло бы со значениями 30 и 50. Остальное я бы хотел, чтобы они были NA.

Я пробовал это:

databig$ratebig <- NA
for (i in 1949:1952) {
  databig$ratebig[datasmall$year == i & (databig$earnings[databig$yearbig==i]==datasmall$moneyband[datasmall$year == i])] <- datasmall$rate[datasmall$year == i & (databig$earnings[databig$yearbig==i]==datasmall$moneyband[datasmall$year == i])]
}

Но разныеРазмер баз данных (или других вещей) доставляет мне неприятности (это дает мне ошибки, а результаты ошибочны).Кажется, что результат не заботится об условиях, как мне бы хотелось, и на него влияют относительное положение и структура в двух наборах данных.В принципе, я не хотел бы объединять наборы данных (мы говорим о большом количестве наблюдений в реальных данных) и надеялся найти способ сделать это.Спасибо !!

1 Ответ

0 голосов
/ 12 декабря 2018

Для вашего случая merge работает нормально

merge(databig, datasmall, by.x = c("yearbig", "earnings"), 
                          by.y = c("year", "moneyband"), all.x = TRUE)

#   yearbig earnings rate
#1     1949        9   NA
#2     1949        9   NA
#3     1949       19   NA
#4     1949       19   NA
#5     1949       30 0.30
#6     1949       30 0.30
#7     1949       39   NA
#8     1949       39   NA
#9     1949       50 0.50
#10    1949       50 0.50
#.....

Что касается того, почему ваш for цикл не работает должным образом, вам нужно сделать это для каждой строки databig

databig$ratebig <- NA
for (i in 1:nrow(databig)) {
   inds <- databig$yearbig[i] == datasmall$year & 
           databig$earnings[i] == datasmall$moneyband
   if (any(inds))
    databig$ratebig[i] <- datasmall$rate[inds]  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...