简体   繁体   English

重塑R中的数据框

[英]Reshape a data frame in R

I have a data frame that looks like 我有一个看起来像的数据框

F1      F2        Number
Banana  Apple     9
Orange  Banana    7
Apple   Orange    8
Banana  Orange    6

I need to convert this to 我需要将其转换为

Type    F1   F2
Banana  15   7
Orange  7    14
Apple   8    9

Here's an approach: 这是一种方法:

setNames(merge(aggregate(Number ~ F1, dat, sum),
               aggregate(Number ~ F2, dat, sum),
               by.x = "F1", by.y = "F2", all = TRUE),
         c("Type", "F1", "F2"))

#     Type F1 F2
# 1  Apple  8  9
# 2 Banana 15  7
# 3 Orange  7 14

where dat is the name of your data frame. 其中dat是数据框的名称。

This problem can also be tackled pretty easily with the "reshape2" package: 使用“ reshape2”包也可以很容易地解决此问题:

library(reshape2)

x <- melt(mydf, id.vars="Number")
dcast(x, value ~ variable, value.var="Number", fun.aggregate=sum)
#    value F1 F2
# 1  Apple  8  9
# 2 Banana 15  7
# 3 Orange  7 14

However, it is also pretty easily tackled with base R: 但是,使用基数R也很容易解决:

xtabs(Number ~ values + ind, 
      cbind(mydf["Number"], 
            stack(mydf[setdiff(names(mydf), "Number")])))
#         ind
# values   F1 F2
#   Apple   8  9
#   Banana 15  7
#   Orange  7 14

In cases where your data are already long, as they are in your comment , it is even more straightforward: 如果您的数据已经很长(如注释中的数据) ,则更加简单:

xtabs(Number ~ Date + Type, mydf)
#           Type
# Date       M1 M2
#   01/01/14  9  7
#   01/02/14  8  6

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM