r当组合不';不存在

r当组合不';不存在,r,reshape,tidyr,reshape2,R,Reshape,Tidyr,Reshape2,我使用restrape2软件包获得了一些数据Imelt和dcast,如下所示 dat <- data.frame(Name = c("Alice", "Alice", "Alice", "Alice", "Bob", "Bob", "Bob"), Month = c(1, 1, 1, 2, 1, 2, 2), Product = c("Car", "Bike", "Car", "Car", "Car", "Bike", "Bike")

我使用
restrape2
软件包获得了一些数据I
melt
dcast
,如下所示

dat <- data.frame(Name = c("Alice", "Alice", "Alice", "Alice", "Bob", "Bob", "Bob"),
              Month = c(1, 1, 1, 2, 1, 2, 2),
              Product = c("Car", "Bike", "Car", "Car", "Car", "Bike", "Bike"),
              Price = c(1000, 150, 300, 500, 2000, 200, 100))
#    Name Month Product Price
# 1 Alice     1     Car  1000
# 2 Alice     1    Bike   150
# 3 Alice     1     Car   300
# 4 Alice     2     Car   500
# 5   Bob     1     Car  2000
# 6   Bob     2    Bike   200
# 7   Bob     2    Bike   100

dat_melt <- melt(dat, id=c("Name", "Month", "Product"))
#    Name Month Product variable value
# 1 Alice     1     Car    Price  1000
# 2 Alice     1    Bike    Price   150
# 3 Alice     1     Car    Price   300
# 4 Alice     2     Car    Price   500
# 5   Bob     1     Car    Price  2000
# 6   Bob     2    Bike    Price   200
# 7   Bob     2    Bike    Price   100

dat_spread <- dcast(dat_melt, Name + Month ~ Product + variable, value.var="value", fun=sum)
#    Name Month Bike_Price Car_Price
# 1 Alice     1        150      1300
# 2 Alice     2          0       500
# 3   Bob     1          0      2000
# 4   Bob     2        300         0

请注意,
reformae2
不是一项要求,因此如果您有一个不使用它的解决方案(例如,使用
tidyverse
函数),这也会很好。

您可以使用
fill
参数指定用于
dcast
中缺少的组合的值:

dcast(dat_melt, Name + Month ~ Product + variable,
      value.var = "value", fun = sum, fill = NA_real_)
#>    Name Month Bike_Price Car_Price
#> 1 Alice     1        150      1300
#> 2 Alice     2         NA       500
#> 3   Bob     1         NA      2000
#> 4   Bob     2        300        NA
由(v0.2.0)于2018年3月7日创建


(请注意,在引擎盖下,
dcast
调用
vapply
,这对类型很挑剔;因此,仅仅指定
fill=NA
是不够的,因为
typeof(NA)==“logical”
并且您的值是数字的:您必须显式地将“double”NA与
NA\u real
一起使用)

作为一种替代方法:您也可以使用
dplyr
+
tidyr
进行所有的整形:

library(dplyr);
library(tidyr);
dat %>%
    group_by(Name, Month, Product) %>%
    summarise(Price = sum(Price)) %>%
    spread(Product, Price);
## A tibble: 4 x 4
## Groups:   Name, Month [4]
#  Name  Month  Bike   Car
#  <fct> <dbl> <dbl> <dbl>
#1 Alice    1.  150. 1300.
#2 Alice    2.   NA   500.
#3 Bob      1.   NA  2000.
#4 Bob      2.  300.   NA
库(dplyr);
图书馆(tidyr);
dat%>%
分组依据(名称、月份、产品)%>%
汇总(价格=总和(价格))%>%
价差(产品、价格);
##一个tibble:4x4
##组:名称、月份[4]
#名月单车
#     
#爱丽丝1。1501300
#爱丽丝2。NA 500。
#3鲍勃1。NA 2000。
#4鲍勃2。300NA

类似于
dcast
spread
有一个
fill
参数,默认为
fill=NA

太棒了,谢谢你的回答。旁注,你的双精度打印出来的数字后面有小数点吗?我的指定,但打印与整数相同。这是您专门设置的吗?带小数点的双精度打印是最近发布的控制TIBLE打印的软件包中的一项功能。@MikkoMarttila感谢您的澄清;我不知道。
library(dplyr);
library(tidyr);
dat %>%
    group_by(Name, Month, Product) %>%
    summarise(Price = sum(Price)) %>%
    spread(Product, Price);
## A tibble: 4 x 4
## Groups:   Name, Month [4]
#  Name  Month  Bike   Car
#  <fct> <dbl> <dbl> <dbl>
#1 Alice    1.  150. 1300.
#2 Alice    2.   NA   500.
#3 Bob      1.   NA  2000.
#4 Bob      2.  300.   NA