使用R对面板数据中横截面单位的值求和
全部, 我工作的公司给了我这些数据。简而言之,这是以公司为横截面单位,以时间单位为会计年度的TSCS数据。每家公司都有不同的账户。我感兴趣的是为一家给定公司的每个账户创造一个总的花费 我可以提供以下数据的简单说明。将使用R对面板数据中横截面单位的值求和,r,data-manipulation,R,Data Manipulation,全部, 我工作的公司给了我这些数据。简而言之,这是以公司为横截面单位,以时间单位为会计年度的TSCS数据。每家公司都有不同的账户。我感兴趣的是为一家给定公司的每个账户创造一个总的花费 我可以提供以下数据的简单说明。将公司作为利益的横截面单位。每个公司都有公司花钱的各种账户。有些账户是所有公司的共同账户,有些账户是独一无二的。并非每家公司在某一年内都有账户支出。事实上,一些人直到数据中的晚些时候才有资格申请账户,而其他人则退出(因此,可以认为面板数据不平衡)。因此,我提供的数据中的NAs可以被视为
公司
作为利益的横截面单位。每个公司
都有公司花钱的各种账户。有些账户是所有公司的共同账户,有些账户是独一无二的。并非每家公司
在某一年内都有账户支出。事实上,一些人直到数据中的晚些时候才有资格申请账户,而其他人则退出(因此,可以认为面板数据不平衡)。因此,我提供的数据中的NAs可以被视为0,尽管这有点问题。有些公司在某一年内是有资格的,但不接受账户中的资金。其他公司因退学或延迟入学而不符合资格
数据是这样的,它是以广泛的格式提供给我的。这是一个简化的例子。在本图中,firm=B
在1990财年不符合账户资格,而firm=C
在1992财年退出
firm account FY1990 FY1991 FY1992
A Account 1 500 900 1000
A Account 2 30 40 40
A Account 3 NA 60 20
A Account 4 NA 35 NA
B Account 1 NA 340 60
B Account 2 NA 500 800
B Account 3 NA 800 NA
B Account 4 NA 60 1000
C Account 1 1000 400 NA
C Account 5 500 60 NA
C Account 8 60 1000 NA
D Account 1 400 400 400
D Account 2 NA 1000 1000
D Account 3 300 40 300
D Account 6 NA 300 300
D Account 7 900 900 1000
D Account 8 1000 1200 1500
我想做的(并且被告知要做的)是修改这些数据,使其看起来像这样:
firm account FY1990 FY1991 FY1992
A Account 1 500 900 1000
A Account 2 30 40 40
A Account 3 NA 60 20
A Account 4 NA 35 NA
A TOTAL 530 1035 1060
B Account 1 NA 340 60
B Account 2 NA 500 800
B Account 3 NA 800 NA
B Account 4 NA 60 1000
B TOTAL NA 1700 1860
C Account 1 1000 400 NA
C Account 5 500 60 NA
C Account 8 60 1000 NA
C TOTAL 1560 1460 NA
D Account 1 400 400 400
D Account 2 NA 1000 1000
D Account 3 300 40 300
D Account 6 NA 300 300
D Account 7 900 900 1000
D Account 8 1000 1200 1500
D TOTAL 2600 3840 4500
我可以在Excel或其他电子表格程序中轻松地完成这项工作,但这将是一件乏味的事情,而且它会引发更多的人为错误,而不是使用R来编程。我并不反对创建一个包含总数的新数据框,而不是尝试在给定公司的所有账户下面添加一行。在给定的会计年度内,对于不符合账户资格的给定公司,只将总数设为0可能更容易。我总是可以将一些零重新编码为NAs next,并将该过程自动化
我的假设是这需要一个循环,但我是R编程的新手。如有任何意见,将不胜感激
下图显示了该图的可复制代码
firm <- c("A","A","A","A","B","B","B","B","C","C","C","D","D","D","D","D","D")
account <- c("Account 1","Account 2","Account 3","Account 4","Account 1","Account 2","Account 3","Account 4","Account 1","Account 5","Account 8","Account 1","Account 2","Account 3","Account 6","Account 7","Account 8")
FY1990 <- c(500,30,NA,NA,NA,NA,NA,NA,1000,500,60,400,NA,300,NA,900,1000)
FY1991 <- c(900,40,60,35,340,500,800,60,400,60,1000,400,1000,40,300,900,1200)
FY1992 <- c(1000,40,20,NA,60,800,NA,1000,NA,NA,NA,400,1000,300,300,1000,1500)
Data=data.frame(firm=firm, account=account, FY1990=FY1990, FY1991=FY1991, FY1992=FY1992)
summary(Data)
Data
公司以下是数据。表
方法:
library(data.table)
dt <- data.table(Data)
dt[, rbind(.SD,
c("TOTAL",
lapply(.SD[, grepl("^FY[0-9]+", names(.SD)), with = F],
function(x){sum(x, na.rm = !all(is.na(x)))}
)),
use.names = F),
by = firm]
您必须首先安装并加载data.table
软件包。如果您想以data.frame
的方式进行安装,这只是另一个选项
require(plyr)
sumNA <- function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE))
res <- rbind(Data,
ddply(within(Data, account <- "TOTAL"), .(firm, account),
numcolwise(sumNA))
)
(res <- res[order(res$firm), ])
## firm account FY1990 FY1991 FY1992
## 1 A Account 1 500 900 1000
## 2 A Account 2 30 40 40
## 3 A Account 3 NA 60 20
## 4 A Account 4 NA 35 NA
## 18 A TOTAL 530 1035 1060
## 5 B Account 1 NA 340 60
## 6 B Account 2 NA 500 800
## 7 B Account 3 NA 800 NA
## 8 B Account 4 NA 60 1000
## 19 B TOTAL NA 1700 1860
## 9 C Account 1 1000 400 NA
## 10 C Account 5 500 60 NA
## 11 C Account 8 60 1000 NA
## 20 C TOTAL 1560 1460 NA
## 12 D Account 1 400 400 400
## 13 D Account 2 NA 1000 1000
## 14 D Account 3 300 40 300
## 15 D Account 6 NA 300 300
## 16 D Account 7 900 900 1000
## 17 D Account 8 1000 1200 1500
## 21 D TOTAL 2600 3840 4500
require(plyr)
sumNA我会在你计算时加上“总计”——现在命名为“VerySpecialAccount10”的账户将被不正确地排序,另一个问题是你将0
替换为NA
——如果你的总计实际上等于0
@eddi,那该怎么办呢。我不知道如何在计算时添加“总计”行。或者,我想,也可以在TOTAL前面加上一个排序很晚的字符。你认为可以做些什么来解决错误的NAs问题?啊,dickoa对NA问题有一个很好的解决方案。非常酷的东西,@eddi!我将做进一步的更改以保存括号。对我来说,它似乎仍然运行正常,但请随意将其回滚。
require(plyr)
sumNA <- function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE))
res <- rbind(Data,
ddply(within(Data, account <- "TOTAL"), .(firm, account),
numcolwise(sumNA))
)
(res <- res[order(res$firm), ])
## firm account FY1990 FY1991 FY1992
## 1 A Account 1 500 900 1000
## 2 A Account 2 30 40 40
## 3 A Account 3 NA 60 20
## 4 A Account 4 NA 35 NA
## 18 A TOTAL 530 1035 1060
## 5 B Account 1 NA 340 60
## 6 B Account 2 NA 500 800
## 7 B Account 3 NA 800 NA
## 8 B Account 4 NA 60 1000
## 19 B TOTAL NA 1700 1860
## 9 C Account 1 1000 400 NA
## 10 C Account 5 500 60 NA
## 11 C Account 8 60 1000 NA
## 20 C TOTAL 1560 1460 NA
## 12 D Account 1 400 400 400
## 13 D Account 2 NA 1000 1000
## 14 D Account 3 300 40 300
## 15 D Account 6 NA 300 300
## 16 D Account 7 900 900 1000
## 17 D Account 8 1000 1200 1500
## 21 D TOTAL 2600 3840 4500