如何轻松地重塑 R 中的数据以按键收集值的分布
How to easily reshape data in R to collect distribution of values by key
假设我有这个数据框:
> df = structure(list(one = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"),class = "factor"), two = 1:6),.Names = c("one", "two"),row.names = c(NA, -6L),class = "data.frame")
> df
one two
1 A 1
2 A 2
3 A 3
4 B 4
5 B 5
6 B 6
并想将其重塑为:
A B
1 4
2 5
3 6
您可以假定第 "one" 列中每个唯一元素的行数相等。
我可以按如下方式进行:
library(tidyr)
df = cbind(df,index=c(1:3,1:3))
spread(df,key = one,value= two)[,-1]
但是,这感觉有点像 hack,因为它使用数据重塑函数,假设结果行是观察值并且每行的值具有某种关系。在此解决方案中,我通过添加允许按我想要的方式进行重塑的索引来建立这种关系。然后要求我删除该附加信息。感觉不干净。
所以我的问题是,是否有一个函数或简单的一行代码可以更直接地完成我想要的事情?
我们可以使用unstack
unstack(df, two~one)
# A B
#1 1 4
#2 2 5
#3 3 6
假设我有这个数据框:
> df = structure(list(one = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", "B"),class = "factor"), two = 1:6),.Names = c("one", "two"),row.names = c(NA, -6L),class = "data.frame")
> df
one two
1 A 1
2 A 2
3 A 3
4 B 4
5 B 5
6 B 6
并想将其重塑为:
A B
1 4
2 5
3 6
您可以假定第 "one" 列中每个唯一元素的行数相等。
我可以按如下方式进行:
library(tidyr)
df = cbind(df,index=c(1:3,1:3))
spread(df,key = one,value= two)[,-1]
但是,这感觉有点像 hack,因为它使用数据重塑函数,假设结果行是观察值并且每行的值具有某种关系。在此解决方案中,我通过添加允许按我想要的方式进行重塑的索引来建立这种关系。然后要求我删除该附加信息。感觉不干净。
所以我的问题是,是否有一个函数或简单的一行代码可以更直接地完成我想要的事情?
我们可以使用unstack
unstack(df, two~one)
# A B
#1 1 4
#2 2 5
#3 3 6