在R中重新格式化表格 [英] Reformat table in R

查看:17
本文介绍了在R中重新格式化表格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张表(ID相同的不同行的性别和年龄值相同,但类别和子类别值不同):

  ID product.category sub.category gender   age
1  1             food      chicken      M young
2  1          kitchen       napkin      M young
3  1             food        steak      M young
4  2       electronic        phone      F   mid
5  3            cloth        shirt      M   old
6  3          kitchen         bowl      M   old
7  4             alch         beer      F young

通过将具有相同ID的不同行组合在一起,我希望将该表改造如下:

  ID product.category1 sub.category1 product.category2 sub.category2 product.category3 sub.category3 gender   age
1  1              food       chicken           kitchen        napkin              food         steak      M young
2  2        electronic         phone              null          null              null          null      F   mid
3  3             cloth         shirt           kitchen          bowl              null          null      M   old
4  4              alch          beer              null          null              null          null      F young

如何在R中执行此操作?

#

新建数据集:文本变量实际上是备注的文本列

text    Category    Subcategory variable1   variable2   variable3   variable4   date
aaaaa   c1  s11 v1  N   RETAIL  Y   2014-01
aaaaa   c2  s22 v1  N   LEASE   Y   2014-01
aaaaa   c3  s31 v1  N   LEASE   Y   2014-01
bbbbb   c1  s12 v2  N   LEASE   Y   2014-01
ccccc   c2  s21 v1  N   LEASE   Y   2014-01
ddddd   c2  s21 v1  N   RETAIL  Y   2014-01
ddddd   c3  s31 v1  N   LEASE   Y   2014-01
eeeee   c1  s11 v1  N   RETAIL  Y   2014-01
fffff   c2  s21 v2  U   RETAIL  Y   2014-01

谢谢

推荐答案

我们使用包reshape2中的meltdcast的组合。

library(dplyr)
library(reshape2)
m2 <- melt(df, c("ID", "gender", "age")) %>% group_by(ID, variable) %>% 
  mutate(variable2 = paste0(variable, seq_along(value)))
newdf <- dcast(m2[!names(m2) %in% "variable"], ...~variable2, value.var="value", fill="null")

我们首先按产品类别和子类别融合原始数据框。接下来,使用dplyr,我们按id列和product列(现在默认情况下称为"变量")进行分组,并创建一个名为variable2的新列。这只是类别标题和观察的连续计数的粘贴。

现在我们有了一个新的列,我们可以通过它来展开数据。我们使用dcast在新的Variable2列上"扩展"。还有一个名为fill的参数,我们将其设置为等于"null"告诉dcast用什么来填充缺失的值。


下面我们将根据所需的输出对列进行重新排序。这个诀窍即使是很小的,也值得注意。创建一个交织的序列是很有趣的。我们的输出将按字母顺序排序("p1"、"p2"、"p3"、"s1"、"s2"、"s3")。我们想要一个将它们编织在一起的序列。挑战是要得到类似(1,4,2,5,3,6)的结果。因此我们使用:

c(rbind(1:3, 4:6))
[1] 1 4 2 5 3 6

酷吧?我们利用了这样一个事实,即当我们按行输入值时,rind将逐列展开。在我们的例子中,写入1:3无济于事,因为数据中可能有更多的产品。但是我们知道有两个标题"产品类别"和"子类别"。我们将variable2的唯一值除以2并改用2。

n <- nrow(unique(m2[,"variable2"]))
newdf[c(1:3,(c(rbind(1:(n/2), (n/2+1):n))+3))]
#   ID gender   age product.category1 sub.category1 product.category2
# 1  1      M young              food       chicken           kitchen
# 2  2      F   mid        electronic         phone              null
# 3  3      M   old             cloth         shirt           kitchen
# 4  4      F young              alch          beer              null
#   sub.category2 product.category3 sub.category3
# 1        napkin              food         steak
# 2          null              null          null
# 3          bowl              null          null
# 4          null              null          null

更新

使用提供的新数据集,相同的代码结构适用于新的列名。

m2 <- melt(df, measure.vars=c("Category", "Subcategory")) %>% group_by(text, variable) %>%
  mutate(variable2 = paste0(variable, seq_along(value)))

newdf <- dcast(m2[!names(m2) %in% "variable"], ... ~ variable2, value.var="value", fill="null")
n <- nrow(unique(m2[,"variable2"]))
newdf2 <- newdf[c(1:5, c(rbind(1:(n/2), (n/2+1):n))+5)]
newdf2
#    text variable1 variable3 variable4    date Category1 Subcategory1 Category2
# 1 aaaaa        v1     LEASE         Y 2014-01      null         null        c2
# 2 aaaaa        v1    RETAIL         Y 2014-01        c1          s11      null
# 3 bbbbb        v2     LEASE         Y 2014-01        c1          s12      null
# 4 ccccc        v1     LEASE         Y 2014-01        c2          s21      null
# 5 ddddd        v1     LEASE         Y 2014-01      null         null        c3
# 6 ddddd        v1    RETAIL         Y 2014-01        c2          s21      null
# 7 eeeee        v1    RETAIL         Y 2014-01        c1          s11      null
# 8 fffff        v2    RETAIL         Y 2014-01        c2          s21      null
#   Subcategory2 Category3 Subcategory3
# 1          s22        c3          s31
# 2         null      null         null
# 3         null      null         null
# 4         null      null         null
# 5          s31      null         null
# 6         null      null         null
# 7         null      null         null
# 8         null      null         null

这篇关于在R中重新格式化表格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆