【问题标题】:cut several variables, using several different number of bins for each variable切割几个变量,为每个变量使用几个不同数量的 bin
【发布时间】:2015-05-01 08:37:55
【问题描述】:

我有一个如下所示的数据集:

ID  a   b
ID1 0.1 20.3
ID2 0.2 21.6
ID3 1.2 1.5
etc.

我想将这些值分成大小相等的组。这可以通过以下方式完成:

data$bin1 <- as.numeric(cut2(data$b,g=50))

这会将 b 列中的值分成 50 个大小相等的组:

ID  a   b    bin
ID1 0.1 20.3 2
ID2 0.2 21.6 2
ID3 1.2 1.5  1
etc.

但是,我需要针对不同数量的组多次执行此操作。我试过了:

for (i in 1:5){
data$bin[i] <- as.numeric(cut2(data$values,g=i*50))
}

但随后我收到此警告:“要替换的项目数不是替换长度的倍数”。

对值进行分组后,我想计算每个组内的均值,可以这样做:

means <- ddply(data,.(bin),summarise,mean.a=mean(a),mean.b=mean(b))

我想对所有的垃圾箱尺寸都这样做。我需要使用另一个for循环吗?还是可以在第一个循环中实现?

【问题讨论】:

  • data$bin[i] 需要一个值

标签: r for-loop plyr mean bins


【解决方案1】:
for (i in 1:5){
    data[paste('bin', i, sep = '')] <- as.numeric(cut2(data$values,g=i*50))
}

将使用 paste 将列 bin1 添加到 bin5 到您的数据框中。

【讨论】:

    【解决方案2】:

    您可以使用lapply 循环遍历数据框中的列,使用sapply 循环遍历值将成为cut(“n_int”)的区间数。结果列表是melted 长格式。

    均值使用aggregate 计算,按“L1”(对应于原始数据中的列)、“cut_set”(割集,2 或 4 个区间)和“interval”(区间数)分组)。

    # some toy data
    d1 <- data.frame(a = 1:10,
                     b = seq(100, 1000, len = 10))
    d1
    
    # a vector of number of intervals
    n_int <- 2 * 1:2
    
    library(reshape2)
    d2 <- melt(lapply(d1, function(x){
      data.frame(x, sapply(n_int, function(i){
        as.integer(cut(x, i))
      })
      )
      }),
      id.vars = "x", variable.name = "cut_set", value.name = "interval")
    
    d3 <- aggregate(x ~ L1 + cut_set + interval, data = d2, mean)
    d3[order(d3$L1, d3$cut_set, d3$interval), ]
    #    L1 cut_set interval     x
    # 1   a      X1        1   3.0
    # 5   a      X1        2   8.0
    # 3   a      X2        1   2.0
    # 7   a      X2        2   4.5
    # 9   a      X2        3   6.5
    # 11  a      X2        4   9.0
    # 2   b      X1        1 300.0
    # 6   b      X1        2 800.0
    # 4   b      X2        1 200.0
    # 8   b      X2        2 450.0
    # 10  b      X2        3 650.0
    # 12  b      X2        4 900.0
    

    使用dplyr的另一种方式:

    library(dplyr)
    d1 %>%
      melt(id.vars = NULL) %>%
      group_by(variable) %>%
      do(data.frame(., sapply(n_int, function(i) as.integer(cut(.$value, i))))) %>%
      melt(id.vars = c("variable", "value"), variable.name = "cut_set", value.name = "interval") %>%
      group_by(variable, cut_set, interval) %>%
      summarise(mean = mean(value)) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2016-07-27
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多