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
软件包获得了一些数据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"),
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