Восстановление результатов в исходном фрейме данных в R - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть данные с ежегодным экспортом фирм в разные страны в разные годы. Моя проблема в том, что мне нужно создать переменную, которая будет указывать для каждого года, сколько фирм в каждой стране. Я могу сделать это отлично с помощью команды "tapply", например

incumbents <- tapply(id, destination-year, function(x) length(unique(x)))

и все работает просто отлично. Моя проблема в том, что у должностных лиц есть длина length(destination-year), и мне нужно, чтобы она имела длину length(id) - каждый год многие фирмы обслуживают каждый пункт назначения - чтобы использовать его в последующей регрессии (конечно, таким образом, чтобы это соответствовало год и место назначения). Цикл for может сделать это, но он очень трудоемкий, так как база данных очень большая.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

Вы не предоставили воспроизводимый пример, поэтому я не могу проверить это, но вы должны иметь возможность использовать ave:

incumbents <- ave(id, destination-year, FUN=function(x) length(unique(x)))
1 голос
/ 14 февраля 2012

Просто «объедините» сводку tapply обратно с исходным фреймом данных с merge.

Поскольку вы не предоставили пример данных, я сделал несколько.Измените соответственно.

n           = 1000
id          = sample(1:10, n, replace=T)
year        = sample(2000:2011, n, replace=T)
destination = sample(LETTERS[1:6], n, replace=T)

`destination-year` = paste(destination, year, sep='-')

dat = data.frame(id, year, destination, `destination-year`)

Теперь сведите ваши сводки в таблицу.Обратите внимание, как я переформатировал фрейм данных и сделал так, чтобы имена соответствовали исходным данным.

incumbents = tapply(id, `destination-year`, function(x) length(unique(x)))
incumbents = data.frame(`destination-year`=names(incumbents), incumbents)

Наконец, вернемся к исходным данным:Кстати, вместо объединения destination и year в третью переменную, как вы, похоже, и сделали, tapply может обрабатывать обе переменные непосредственно в виде списка:

incumbents = melt(tapply(id, list(destination=destination, year=year), function(x) length(unique(x))))
0 голосов
/ 14 февраля 2012

Используя превосходные примерные данные @ JohnColby, я подумал о чем-то более похожем на это:

#I prefer not to deal with the pesky '-' in a variable name
destinationYear = paste(destination, year, sep='-')

dat = data.frame(id, year, destination, destinationYear)

#require(plyr)
dat <- ddply(dat,.(destinationYear),transform,newCol = length(unique(id)))

#Or if more speed is required, use data.table
require(data.table)
datTable <- data.table(dat)

datTable <- datTable[,transform(.SD,newCol = length(unique(id))),by = destinationYear]
...