将行中给出的数据转换为 R 中列中给出的数据

Turning data given in rows to data given in Columns in R

我有一个数据集,其中观察值按行给出,但我想创建一个面板,其中观察值按列给出。例如:

A<-as.data.frame(rbind(c('A','B','C',5,6),c('A','B','D',2,3)))
colnames(A)<-c('State','County','City',1983,1984)
> A
  State County City 1983 1984
1     A      B    C    5    6
2     A      B    D    2    3

如果我运行下面的代码:

library(dplyr)
B<-B%>%
  group_by(State,County,City)%>%
  do(data.frame(year=seq(1983,1984,by=1)))
B<-cbind(B,0)
colnames(B)[5]<-'val'
for(i in unique(B$State)){
  for(j in unique(B$County)){
    for(k in unique(B$City)){
      B$val[B$State==i&B$County==j&B$City==k]<-as.matrix(A[A$State==i&A$County==j&A$City==k,4:5])
    }
  }
}
B<-as.data.frame(B)

然后我得到

> B
  State County City year val
1     A      B    C 1983   5
2     A      B    C 1984   6
3     A      B    D 1983   2
4     A      B    D 1984   3

我希望能够做到这一点,但最后不求助于 for 循环,因为 for 循环在处理具有大量观察值的数据集时效率非常低(我的实际数据集有 100,000 个观察值).

使用来自 tidyr 的 pivot_longer:

library(tidyr)
library(dplyr)
A %>% pivot_longer(cols = c('1983', '1984'), names_to = 'year', values_to = 'val') 
# A tibble: 4 x 5
  State County City  year  val  
  <chr> <chr>  <chr> <chr> <chr>
1 A     B      C     1983  5    
2 A     B      C     1984  6    
3 A     B      D     1983  2    
4 A     B      D     1984  3    
>