繁体   English   中英

R- reshape2具有聚合最小功能

[英]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

零表示rutclimes_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

你可以通过aggregatereshapestats来做到这一点:

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.

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