首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中按组和ID减去滞后元素,考虑NAs,并在需要时添加Nas

在R中按组和ID减去滞后元素,考虑NAs,并在需要时添加Nas
EN

Stack Overflow用户
提问于 2022-11-23 07:50:55
回答 1查看 24关注 0票数 0

我正在分析一个大型数据库(描述后的片段)。为了给出一些背景,我正在分析公司的绩效,用专利和专利引用来衡量连任的CEO。

为了了解CEO们对他们公司的影响,我现在计算了列生产力(这里称为data)前三个条目的总和,以便:

今年的生产力等于今年+去年+前一年的生产力之和。

我现在要找的公式是今年的生产力,按上面的计算,可以追溯到3年前。所以,简而言之,我想把第一年的条目减去第三年(今年)的所有条目。下面是我想在excel中做的一个例子。在这个例子中,我要回到4年前!

现在,我需要通过公司和CEO ID来做这件事。正如你所看到的,并不是所有的年份都有一个条目,所以我不能总是回到过去。在这种情况下,我希望条目成为NA。

这里有一个简化的数据库

代码语言:javascript
复制
ID <- c(1,1,1,1,1,1,3,3,3,5,5,4,4,4,4,4,4,4) #CEO ID
C <- c('a','a','a','a','a','a','b','b','b','b','b','c','c','c','c','c','c','c') #Company 
fyear <- c(2000, 2001, 2002,2003,2004,2005,2000, 2001,2002,2003,2004,2000, 2001, 2002,2003,2004,2005,2006)
data <- c(30,50,22,44,68,100,5,3,7,6,9,3,5,6,7,44,33,NA)
df1 <- data.frame(ID,C,fyear, data)

ID  C   fyear  data
1   a   2000    NA  
1   a   2001    50  
1   a   2002    22  
1   a   2003    44  
1   a   2004    68  
1   a   2005    100 
3   b   2000    NA  
3   b   2001    3   
3   b   2002    7   
5   b   2003    6   
5   b   2004    9   
4   c   2000    3   
4   c   2001    5   
4   c   2002    6   
4   c   2003    5   
4   c   2004    44  
4   c   2005    33  
4   c   2006    NA

这是所需的输出。如你所知,对于一些首席执行官来说,所有的条目都是NAs。

代码语言:javascript
复制
ID  C   fyear  data diff.
1   a   2000    NA   NA
1   a   2001    50   NA
1   a   2002    22   NA
1   a   2003    44   -6  # 44-50
1   a   2004    68   46  # 68-22
1   a   2005    11   -33 # 11-44
3   b   2000    NA   NA
3   b   2001    3    NA
3   b   2002    7    NA
5   b   2003    6    NA  # here the company is the same but I'm analyzing a different CEO (ID)
5   b   2004    9    NA
4   c   2000    3    NA
4   c   2001    5    NA
4   c   2002    6    3
4   c   2003    5    0
4   c   2004    44   38
4   c   2005    33   28
4   c   2006    NA   NA

我试图用这里找到的一些公式来解决这个问题,但是其中一些公式不起作用(我得到了所有的0),而这些公式仍然无助于解决这样一个特定的问题。

非常感谢,我希望有人能对此发扬光大。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-23 08:31:11

这是你想要的吗?

代码语言:javascript
复制
ID <- c(1, 1, 1, 1, 1, 1, 3, 3, 3, 5, 5, 4, 4, 4, 4, 4, 4, 4) # CEO ID
C <- c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "c", "c") # Company
fyear <- c(2000, 2001, 2002, 2003, 2004, 2005, 2000, 2001, 2002, 2003, 2004, 2000, 2001, 2002, 2003, 2004, 2005, 2006)
data <- c(NA, 50, 22, 44, 68, 11, NA, 3, 7, 6, 9, 3, 5, 6, 5, 44, 33, NA)
df1 <- data.frame(ID, C, fyear, data)

library(dplyr)
df1 |>
  group_by(ID, C) |>
  mutate(diff = data - dplyr::lag(data, 2))

输出

代码语言:javascript
复制
# A tibble: 18 × 5
# Groups:   ID, C [4]
      ID C     fyear  data  diff
   <dbl> <chr> <dbl> <dbl> <dbl>
 1     1 a      2000    NA    NA
 2     1 a      2001    50    NA
 3     1 a      2002    22    NA
 4     1 a      2003    44    -6
 5     1 a      2004    68    46
 6     1 a      2005    11   -33
 7     3 b      2000    NA    NA
 8     3 b      2001     3    NA
 9     3 b      2002     7    NA
10     5 b      2003     6    NA
11     5 b      2004     9    NA
12     4 c      2000     3    NA
13     4 c      2001     5    NA
14     4 c      2002     6     3
15     4 c      2003     5     0
16     4 c      2004    44    38
17     4 c      2005    33    28
18     4 c      2006    NA    NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74543326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档