【问题标题】:R coding: How to keep records with only 4 complete quarters of data and how to take a conditional sum with multiple conditionsR 编码:如何只保留 4 个完整季度数据的记录以及如何在多个条件下进行条件和
【发布时间】:2016-11-01 20:44:38
【问题描述】:

我有一个包含公司季度数据的数据框,我有两个问题:

1:我怎样才能只保留那些有四个季度数据的公司的记录(因为公司有时会出现有 1、2 或 3 个季度的数据,但我需要在整个数据框中为每个公司保留 4 个季度)

2:因为我有季度数据,所以我想在两个条件下取所有四个季度的年平均值或总和(基于变量类型):年份和公司。

例如,公司 i 在 1984 年的平均存货价值和总收入分别是 I1984 和 REV1984,基于四个不同的季度值。我目前正在使用这些代码行 - 用于均值和总和 - 但 R 不断返回“NA”,我已经搜索并搜索了替代方案,但似乎没有任何效果:

Company i_ I1984 <- with(R, mean(I [FY == "1984" & Co == "AAR CORP" ]))
Company i_ REV1984 <- with(R, sum(REVQ [FY == "1984" & Co == "AAR CORP" ]))

R 是我的数据框 I

显然,当我找到每个新的平均值/总和值并将其放入新的data.frame 时,引号中的值将变为动态值。

任何帮助将不胜感激。谢谢

我在下面包含了一个示例代码:

company<-c("xray", "xray", "xray",  "xray", "foxrot", "foxrot", "delta",     "kilo", "kilo" )  
qtr <-c("1","2","3","4", "1", "2","4", "2","3")

IQ <- rnorm(9,0,10)  
REVQ <- rnorm(9,0,10)  
AssetQ <- rnorm(9,0,10)  
CashQ  <- rnorm(9,0,10)  

#Modified dataframe  
data<-data.frame( company, qtr, IQ, REVQ, AssetQ, CashQ )

在此示例中,“xray”应该是我们对其进行均值/总和的唯一公司。

【问题讨论】:

  • 你有两个不同的问题;你应该单独问他们。您还应该看看how to make a great reproducible example - 数据快照几乎没用,但与dput() 共享的一小部分行/列是无价的
  • 所以将这个问题编辑为一个问题,为另一个问题提出一个新问题,并在两个问题中重复共享一些数据! (也就是说,NA 可能是由于您的数据中缺少值,所以当第一个问题得到回答时,您可能根本不需要第二个问题。)
  • 我将作为单独的问题重新发布。谢谢
  • 我在这里重新发布了这个问题的第一部分:stackoverflow.com/q/38113824/4318393 - 谢谢!

标签: r row conditional


【解决方案1】:

对于您的第一个问题(使用下面 cmets 中的 df 结构):

company<-c("xray", "xray", "xray", "xray", "foxrot", "foxrot", "delta", "kilo", "kilo" )  
qtr <-c("1","2","3","4", "1", "2","4", "2","3")  
IQ <- rnorm(9,0,10)  
REVQ <- rnorm(9,0,10)  
AssetQ <- rnorm(9,0,10)  
CashQ <- rnorm(9,0,10)  
#Modified dataframe  
data<-data.frame(company,qtr, IQ, REVQ, AssetQ, CashQ )


#Using the dplyr package:  
data.complete<-data.frame(data %>% group_by(company) %>% filter(n() == 4))

第二个问题

#Get your sum and means (note that the 'by' command will separate the sums based on the company factor when you have more than 1 company with complete data)  
aggregate(data.complete[,3:6], by=list(data.complete$company), sum)
aggregate(data.complete[,3:6], by=list(data.complete$company), mean)

【讨论】:

  • 我们很接近,但您的示例数据框与我的略有不同,我已经修改了您的示例代码,以便我们与我所看到/正在使用的内容在同一页面上:公司
  • 请注意,每家公司的“1-2-3-4”季度序列是如何不一致的(即 xray 是唯一一家拥有所有四个季度的公司),并且该数据框没有“NA”条目(我已经在这个数据清理阶段删除了那些)
  • 有了这个新的数据框,“xray”将是我要运行的唯一一家公司,例如,四个完整季度的库存平均值和收入总和。我非常感谢您的帮助,并为没有首先提供更好的示例而深表歉意
  • 我在这里重新发布了这个问题的第一部分:stackoverflow.com/q/38113824/4318393
  • 我想我现在根据您更新的数据框架结构为您提供了一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
相关资源
最近更新 更多