问题描述
我对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()
分步操作,这是上面的代码的作用:
- 它按
id
对数据进行分组。 - 然后使用
lag()
函数查找x
的先前值。 - 如果
x
与前一个x
不同,则会在列xChanged
中输入“是”。 - 否则,它在列
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。