gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:57:23 36 4
gpt4 key购买 nike

全部,

我工作的公司给了我这些数据供我使用。简而言之,就是以公司为横截面单位,时间单位为会计年度的TSCS数据。每个公司都有不同的账户。我有兴趣创建给定公司在每个帐户上花费的总金额。

我可以提供以下数据的简单说明。让 firm 成为感兴趣的横截面单位。每个 firm 都有公司花钱的各种账户。有些账户是所有公司通用的,有些是独一无二的。并非每个公司在给定年份都有钱花在帐户上。事实上,有些人直到后来的数据才符合账户资格,而其他人则退出了(因此,面板数据可以被认为是不平衡的)。因此,我提供的数据中的 NA 可以被视为 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 可能更容易。接下来我总是可以将一些零重新编码为 NA,并自动执行该过程。

我的假设是这需要一个循环,但我是 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

最佳答案

这是一个 data.table 方法:

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]

其工作方式如下:我们迭代公司 (by = firm),并为每个公司堆叠 (rbind)...

  • 与该公司相关的数据子集 (.SD)
  • 一个以 "TOTAL" 开头的向量,其余部分由那个长的 lapply 调用创建。

lapply 一次仅处理与一家公司相关的数据。此数据存储在上面提到的特殊临时数据表 .SD 中。列名也可以直接命名(但本例中没有)。

lapply 调用的工作方式如下:我们迭代一个向量列表(通过选择名称通过我们的 grepl 正则表达式测试的列来选择),并且对于每个向量vector 我们应用 sum 函数的特殊变体。

sum 函数的这个变体着眼于完整的向量 x,其中再次 - 这个向量是从我们正在迭代的列表中选择的,并且一次只有与一个公司相关联的行 - - 并检查 x 中是否有任何非 NA 条目(即,如果 !all(is.na(x))) .如果有,则将这些条目相加,将所有 NA 视为零(因为 na.rm=TRUE);如果不是,它返回 NA(因为 na.rm=FALSE 并且我们有 NA)。

有关 na.rm 参数的详细信息,请查看 ?sum。同样,可以通过搜索 ?term? “术语”

by=firm 选项然后堆叠公司的结果并将“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
5: A TOTAL 530 1035 1060
6: B Account 1 NA 340 60
7: B Account 2 NA 500 800
8: B Account 3 NA 800 NA
9: B Account 4 NA 60 1000
10: B TOTAL NA 1700 1860
11: C Account 1 1000 400 NA
12: C Account 5 500 60 NA
13: C Account 8 60 1000 NA
14: C TOTAL 1560 1460 NA
15: D Account 1 400 400 400
16: D Account 2 NA 1000 1000
17: D Account 3 300 40 300
18: D Account 6 NA 300 300
19: D Account 7 900 900 1000
20: D Account 8 1000 1200 1500
21: D TOTAL 2600 3840 4500
firm account FY1990 FY1991 FY1992

您必须先安装并加载 data.table 包。

关于r - 使用 R 对面板数据中横截面单位的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16655281/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com