r - 重构面板数据框
问题描述
我有一个具有以下面板结构的数据框。但是,我想更改结构,因此列将折叠并对应于给定年份的测量值。
y <- data.frame(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
year = c(2012, 2013, 2014, 2012, 2013, 2014, 2012, 2013, 2014),
P2012 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
P2013 = c(2, 2, 2, 1, 1, 1, 1, 1, 1),
P2014 = c(3, 3, 3, 2, 2, 2, 1, 1, 1))
id year P2012 P2013 P2014
1 1 2012 1 2 3
2 1 2013 1 2 3
3 1 2014 1 2 3
4 2 2012 2 1 2
5 2 2013 2 1 2
6 2 2014 2 1 2
7 3 2012 3 1 1
8 3 2013 3 1 1
9 3 2014 3 1 1
我想要的是我只得到一列,由其他三列的值组成。
id year P2012 P2013 P2014 P
1 1 2012 1 2 3 1
2 1 2013 1 2 3 2
3 1 2014 1 2 3 3
4 2 2012 2 1 2 2
5 2 2013 2 1 2 1
6 2 2014 2 1 2 2
7 3 2012 3 1 1 3
8 3 2013 3 1 1 1
9 3 2014 3 1 1 1
有人能帮我一下吗?
谢谢!
解决方案
您可以使用矩阵子集来提取每年的相应值。
y$P <- y[cbind(1:nrow(y), match(paste0('P', y$year), names(y)))]
y
# id year P2012 P2013 P2014 P
#1 1 2012 1 2 3 1
#2 1 2013 1 2 3 2
#3 1 2014 1 2 3 3
#4 2 2012 2 1 2 2
#5 2 2013 2 1 2 1
#6 2 2014 2 1 2 2
#7 3 2012 3 1 1 3
#8 3 2013 3 1 1 1
#9 3 2014 3 1 1 1
推荐阅读
- reactjs - 如何访问子组件中的 this.props.location?
- ios - 从 ARReferenceImage 获取 UIImage 或 CIImage
- c# - 并行使用 DbContext
- angular - 在Angular中上传图像后如何重置文件输入表单?
- android - Android GridLayoutManager 均匀行距
- javascript - 添加越来越多
问题。如果一个人被改变,它会改变所有的人 - java - 静态对象与构造函数,为什么构造函数首先执行并在静态引用变量中分配
- c# - 在 C# 中,如何在数组中的元素被修改时触发 PropertyChanged 事件
- java - 如何以与记录区域格式相同的格式获取显示时间?
- ios - 从 tableview 删除行时崩溃