带有R的面板数据中变量的计数/曲线随时间变化

问题描述

我对R还是比较陌生,对一个简单的事情一无所知。我有面板数据,我想绘制或计算有多少观察单位经历了特定变量随时间的变化。数据如下所示:

statename,from,to,id,x
United States,1946,1965,201000,United States,202000,203000,false
United States,1970,1973,true
United States,204000,205000,true

因此,确切地说,我想获取ids发生变化的x中有多少,和/或true总是有x以及false中总是有x的人。

如果x至少一次是true,至少一次是false,即发生了变化,我试图制作一个等于1的虚拟对象。但是,它没有用。我还尝试使用table()aggregate()group_by()count()函数(部分组合)来解决问题,但是我没有得到想要的东西。

有人可以帮忙吗?

解决方法

要使其可复制:

my_data <- read.csv(text=
"statename,from,to,id,x
United States,1946,1965,201000,United States,202000,203000,false
United States,1970,1973,true
United States,204000,205000,true",header=TRUE)

这是使用软件包dplyr和函数mutate()lag()的解决方案:

library(dplyr)
my_data <- my_data %>%
  group_by(id) %>%
  mutate(xChanged = case_when(x != lag(x) ~ "Yes",TRUE ~ "No")) %>%
  as.data.frame()

分步操作,这是上面的代码的作用:

  1. 它按id对数据进行分组。
  2. 然后使用lag()函数查找x的先前值。
  3. 如果x与前一个x不同,则会在列xChanged 中输入“是”。
  4. 否则,它在列xChanged中输入“否”

输出将如下所示:

> my_data
      statename from   to     id     x xChanged
1 United States 1946 1965 201000             No
2 United States 1946 1965 202000             No
3 United States 1946 1965 203000 false       No
4 United States 1970 1973 203000  true      Yes
5 United States 1946 1965 204000             No
6 United States 1946 1965 205000  true       No

现在您可以计算xChanged中有多少个“是”。

nrow(my_data[my_data$xChanged == "Yes",])

结果:1​​。