我试图转换表单的数据
收据< - data.frame(收据= c(193,193,193,987,215,215), product = c(“spanner”,“saw”,“widget”,“glue”,“widget”,“hammer”), …
基地 reshape 功能完美无缺:
reshape
df <- data.frame( year = c(rep(2000, 12), rep(2001, 12)), month = rep(1:12, 2), values = rnorm(24) ) df_wide <- reshape(df, idvar="year", timevar="month", v.names="values", direction="wide", sep="_") df_wide
哪里
idvar
timevar
v.names
direction
sep
data.frame
如果不 idvar 存在,在使用之前创建一个 reshape() 功能:
reshape()
df$id <- c(rep("year1", 12), rep("year2", 12)) df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_") df_wide
记住这一点 idvar 是必须的!该 timevar 和 v.names 部分很容易。由于所有内容都是明确定义的,因此该函数的输出比其他函数更可预测。
运用 reshape 功能:
reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
来自Win-Vector的天才数据科学家提供了非常强大的新软件包 vtreat , seplyr 和 replyr )叫 cdata 。它实现了“协调数据”原则 这个文件 而且在这 博客文章 。我们的想法是,无论您如何组织数据,都应该可以使用“数据坐标”系统识别各个数据点。以下摘录自John Mount最近的博客文章:
vtreat
seplyr
replyr
cdata
整个系统基于两个原语或运算符 cdata :: moveValuesToRowsD()和cdata :: moveValuesToColumnsD()。这些 操作员具有枢轴,非枢轴,单热编码,转置,移动 多行和多列,以及许多其他转换为简单特殊 案例。 从中可以很容易地编写许多不同的操作 cdata原语。这些运算符可以处理内存或大数据 规模(使用数据库和Apache Spark;对于大数据使用 cdata :: moveValuesToRowsN()和cdata :: moveValuesToColumnsN() 变种)。变换由控制表控制 本身是变换的图(或图片)。
整个系统基于两个原语或运算符 cdata :: moveValuesToRowsD()和cdata :: moveValuesToColumnsD()。这些 操作员具有枢轴,非枢轴,单热编码,转置,移动 多行和多列,以及许多其他转换为简单特殊 案例。
从中可以很容易地编写许多不同的操作 cdata原语。这些运算符可以处理内存或大数据 规模(使用数据库和Apache Spark;对于大数据使用 cdata :: moveValuesToRowsN()和cdata :: moveValuesToColumnsN() 变种)。变换由控制表控制 本身是变换的图(或图片)。
我们将首先构建控制表(参见 博客文章 有关详细信息),然后执行从行到列的数据移动。
library(cdata) # first build the control table pivotControlTable <- buildPivotControlTableD(table = dat1, # reference to dataset columnToTakeKeysFrom = 'numbers', # this will become column headers columnToTakeValuesFrom = 'value', # this contains data sep="_") # optional for making column names # perform the move of data to columns dat_wide <- moveValuesToColumnsD(tallTable = dat1, # reference to dataset keyColumns = c('name'), # this(these) column(s) should stay untouched controlTable = pivotControlTable# control table above ) dat_wide #> name numbers_1 numbers_2 numbers_3 numbers_4 #> 1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474 #> 2 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
其他两个选择:
基础包:
df <- unstack(dat1, form = value ~ numbers) rownames(df) <- unique(dat1$name) df
sqldf 包:
sqldf
library(sqldf) sqldf('SELECT name, MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1, MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2, MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3, MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4 FROM dat1 GROUP BY name')
使用基数R. aggregate 功能:
aggregate
aggregate(value ~ name, dat1, I) # name value.1 value.2 value.3 value.4 #1 firstName 0.4145 -0.4747 0.0659 -0.5024 #2 secondName -0.8259 0.1669 -0.8962 0.1681
使用您的示例数据框,我们可以:
xtabs(value ~ name + numbers, data = dat1)
如果性能是一个问题,另一个选择是使用 data.table 的扩展 reshape2 融化与融化dcast功能
data.table
reshape2
( 参考:使用data.tables进行高效的整形 )
library(data.table) setDT(dat1) dcast(dat1, name ~ numbers, value.var = "value") # name 1 2 3 4 # 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 # 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814
而且,从data.table v1.9.6开始,我们可以在多列上进行转换
## add an extra column dat1[, value2 := value * 2] ## cast multiple value columns dcast(dat1, name ~ numbers, value.var = c("value", "value2")) # name value_1 value_2 value_3 value_4 value2_1 value2_2 value2_3 value2_4 # 1: firstName 0.1836433 -0.8356286 1.5952808 0.3295078 0.3672866 -1.6712572 3.190562 0.6590155 # 2: secondName -0.8204684 0.4874291 0.7383247 0.5757814 -1.6409368 0.9748581 1.476649 1.1515627
你可以这样做 reshape() 功能,或与 melt() / cast() 重塑包中的函数。对于第二个选项,示例代码是
melt()
cast()
library(reshape) cast(dat1, name ~ numbers)
或使用 reshape2
library(reshape2) dcast(dat1, name ~ numbers)