[英]R- reshape2 with aggregation min function
我需要在R中转置一个df,聚合函数必须是min。
例:
library(reshape2)
N <- 20
df <- data.frame(rutcli=sample(101:103, N, replace=T),
mes_atras=sample(1:4, N, replace=T), pay_day=sample(1:30, N, replace=T))
s<-dcast(df, rutcli ~ mes_atras, fun.aggregate = min, value.var = 'pay_day')
View(s)
但我得到一个警告:
警告消息:在.fun(.value [0],...)中:min没有非缺失参数; 返回Inf
结果不是理想的:
rutcli 1 2 3 4
101 1 1 Inf 1
102 Inf 2 14 8
103 3 6 2 25
我怎么解决这个问题?
谢谢
您收到警告是因为您要求空集的最小值。 例如,没有rutcli
= 102和mes_atras
= 1的pay_day
值,因此返回Inf
。
如果设置fun.aggregate=length
则可以更轻松地看到这一点。 例如:
library(reshape2)
N <- 20
set.seed(11) # To make the `sample` function reproducible
df <- data.frame(rutcli=sample(101:103, N, replace=T),
mes_atras=sample(1:4, N, replace=T),
pay_day=sample(1:30, N, replace=T))
dcast(df, rutcli ~ mes_atras, fun.aggregate = length, value.var = 'pay_day')
rutcli 1 2 3 4
1 101 4 4 2 0
2 102 1 3 1 0
3 103 2 2 0 1
零表示rutcli
和mes_atras
组合,其中没有pay_day
值。 如果我们使用min
函数在这个数据框上运行dcast
,我们将得到Inf
出现零的地方:
dcast(df, rutcli ~ mes_atras, fun.aggregate = min, value.var = 'pay_day')
rutcli 1 2 3 4
1 101 1 5 7 Inf
2 102 18 13 14 Inf
3 103 10 13 Inf 7
Warning message:
In .fun(.value[0], ...) : no non-missing arguments to min; returning Inf
您可以使用split-apply-combine方法之一获取NA
而不是Inf
。 @MatthewLundberg给出了一个基本R
方法。 这是dplyr
的一个:
library(dplyr)
df %>%
group_by(rutcli, mes_atras) %>%
summarise(min_pay_day=min(pay_day)) %>%
dcast(rutcli ~ mes_atras, value.var="min_pay_day")
rutcli 1 2 3 4
1 101 1 5 7 NA
2 102 18 13 14 NA
3 103 10 13 NA 7
你可以通过aggregate
和reshape
包stats
来做到这一点:
reshape(
aggregate(pay_day ~ mes_atras + rutcli, data=df, FUN=min),
direction='wide', timevar='mes_atras', idvar='rutcli'
)
## rutcli pay_day.1 pay_day.2 pay_day.3 pay_day.4
## 1 101 1 20 15 2
## 5 102 18 30 NA 3
## 8 103 2 5 23 16
如果需要,可以用Inf
替换NA
值。
这是我的df
:
structure(list(rutcli = c(103L, 103L, 103L, 103L, 103L, 103L,
102L, 102L, 103L, 102L, 101L, 101L, 101L, 101L, 101L, 103L, 102L,
101L, 101L, 103L), mes_atras = c(1L, 3L, 4L, 1L, 1L, 2L, 1L,
4L, 1L, 2L, 2L, 4L, 3L, 2L, 2L, 4L, 4L, 4L, 1L, 2L), pay_day = c(3L,
23L, 16L, 18L, 2L, 5L, 18L, 3L, 12L, 30L, 20L, 2L, 15L, 24L,
29L, 24L, 3L, 19L, 1L, 12L)), .Names = c("rutcli", "mes_atras",
"pay_day"), row.names = c(NA, -20L), class = "data.frame")
我做到了:
my.min <- function (v) {if (length(v) == 0) 0 else min(v)}
s<-dcast(df, rutcli ~ mes_atras, fun.aggregate = my.min, value.var = 'pay_day')
因为我知道我没有任何0:s [s == 0] < - NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.