Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R对面板数据中横截面单位的值求和_R_Data Manipulation - Fatal编程技术网

使用R对面板数据中横截面单位的值求和

使用R对面板数据中横截面单位的值求和,r,data-manipulation,R,Data Manipulation,全部, 我工作的公司给了我这些数据。简而言之,这是以公司为横截面单位,以时间单位为会计年度的TSCS数据。每家公司都有不同的账户。我感兴趣的是为一家给定公司的每个账户创造一个总的花费 我可以提供以下数据的简单说明。将公司作为利益的横截面单位。每个公司都有公司花钱的各种账户。有些账户是所有公司的共同账户,有些账户是独一无二的。并非每家公司在某一年内都有账户支出。事实上,一些人直到数据中的晚些时候才有资格申请账户,而其他人则退出(因此,可以认为面板数据不平衡)。因此,我提供的数据中的NAs可以被视为

全部,

我工作的公司给了我这些数据。简而言之,这是以公司为横截面单位,以时间单位为会计年度的TSCS数据。每家公司都有不同的账户。我感兴趣的是为一家给定公司的每个账户创造一个总的花费

我可以提供以下数据的简单说明。将
公司
作为利益的横截面单位。每个
公司
都有公司花钱的各种账户。有些账户是所有公司的共同账户,有些账户是独一无二的。并非每家
公司
在某一年内都有账户支出。事实上,一些人直到数据中的晚些时候才有资格申请账户,而其他人则退出(因此,可以认为面板数据不平衡)。因此,我提供的数据中的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