我正在尝试使用面板数据和每年的winsorize(替换值与平均值相差2或3个标准偏差的异常值)。我安装了包含这样一个函数的robustHD软件包,但是我无法在我的数据集上实现它。
我的数据集与Grunfeld(虽然我有NA)在同一年看起来与不同的公司相似。 (1935年至1954年)
> head(Grunfeld, 6)
firm year inv value capital
1 1 1935 317.6 3078.5 2.8
2 1 1936 391.8 4661.7 52.6
3 1 1937 410.6 5387.1 156.9
4 1 1938 257.7 2792.2 209.2
5 1 1939 330.8 4313.2 203.4
6 1 1940 461.2 4643.9 207.2
我现在要做的是仅对所有公司的某些列(即inv和value)进行winsorize,并将其存储在具有相同结构的数据框中。我尝试了以下代码:
如下所述,plyr是分割数据帧和应用函数的好方法,但我无法使其工作。
library(plm)
library(robustHD)
library(plyr)
data("Grunfeld", package="plm")
#Winsorize data each year (over all firms) therefore split dataframe for each year and apply the winsorize function)
Grunfeld.w<-ddply(Grunfeld, .(year) function(x) winsorize(x$inv,x$value))
答案 0 :(得分:2)
您可以预先创建一个列表来存储数据框。列表的长度必须为n,其中n是年份中唯一值的数量。
library(plm)
library(robustHD)
data("Grunfeld", package="plm")
## determine unique values in year and their length
unique_years <- unique(Grunfeld$year)
n_unique_years <- length(unique_years)
## create an empty list of length 20
Grunfeld.w <- vector("list", length=n_unique_years)
for(i in 1:n_unique_years){
Grunfeld.w[[i]] <- winsorize(subset(Grunfeld, year==unique_years[i],
select=c(inv, value)))
## add the year field to each insorized data frame
Grunfeld.w[[i]] <- cbind(Grunfeld.w[[i]], year=unique_years[i])
}
现在每个winsorized数据都作为数据框存储在Grunfeld.w列表中。如果只需要一个数据框,请使用以下命令:
## convert the list to one data frame
temp <- data.frame(do.call("rbind", Grunfeld.w))
至于你的第二个问题,我猜你想要根据某些特征选择“主题”(例如,x> 5000),但你不想使用subset
功能。然后你可以使用dplyr
的{{1}}函数..再次让我用Grunfeld数据来说明:
filter
如果您想以与原始数据相同的方式排列新数据,可以使用library(dplyr)
Grunfeld_gt1940 <- filter(Grunfeld, year>1940) ## the "gt" stands for "greater than".
提取原始订单:
rownames