将行中给出的数据转换为 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
>
我有一个数据集,其中观察值按行给出,但我想创建一个面板,其中观察值按列给出。例如:
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
>