【问题标题】:Counting values in data frame subject to conditions根据条件计算数据框中的值
【发布时间】:2012-07-06 15:12:52
【问题描述】:

我一直在四处寻找,但无法弄清楚如何汇总我的数据框中的数据(受某些范围的影响)。我知道在应用 daaply/taaply 或 table 的某种组合时可以做到这一点,但我无法得到我期望的确切结果。

基本上我想转这个:

part_no val1 val2 val3
2 1 2 3 45.3
2 1 3 4 -12.3
3 1 3 4 99.3
3 1 5 2 -3.2
3 1 4 3 -55.3

进入这个:

part_no val3_between0_50 val3_bw50_100 val3_bw-50_0 val3_bw-100_-50
2 1 0 0 1 0
3 0 1 0 1 1

这是虚拟数据,我得到了更多行,但想法是一样的。我只想计算满足特定条件的参与者的值的数量。

如果有人能一步一步地解释它,我将不胜感激。我看到很多不同的小帖子,但没有一个能做到这一点,我的尝试只让我成功了一半。比如使用table

【问题讨论】:

  • 如果您以更易于重现的格式提供数据,其他人可以更快地回答问题。 stackoverflow.com/questions/5963269/…
  • 同时,看看cut函数。
  • @RichieCotton 谢谢,我不知道如何格式化问题,所以我只输入了代码块。

标签: r


【解决方案1】:

下一个更好的解决方案(不需要下面使用的额外行,尽管如果您想将重命名代码移动到此矩阵结果,您可以):

xtabs(~part_no +cut(val4, breaks=c(-100, -50, 0, 50, 100) ), dat=dat)
 #-------------
       cut(val4, breaks = c(-100, -50, 0, 50, 100))
part_no (-100,-50] (-50,0] (0,50] (50,100]
      2          0       1      1        0
      3          1       1      0        1

第一次尝试: .... n 稍微不同的问题,很容易适应你的情况。我遇到的困难是我的解决方案要求 part_no 以 1 开头。我想你可以稍后分配行标签。或者将 'part_no' 设为一个因子并使用其数值模式值。

 dat <- read.table(text="part_no val1 val2 val3 val4
 1 1 2 3 -32
 2 1 2 3 45.3
 2 1 3 4 -12.3
 3 1 3 4 99.3
 3 1 5 2 -3.2
 3 1 4 3 -55.3
 ", head=T)

levs= 4; recs <- matrix( c(unique(dat$part_no), 
                           rep(0, levs*length(unique(dat$part_no))) ), 
                        nrow=length(unique(dat$part_no)) )
 recs[ cbind( dat$part_no, 
              1+ findInterval(dat$val4, c(-100, -50, 0, 50, 100) ) )] <- 1
 recs
#------------------------------------
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    0    0
[2,]    2    0    1    1    0
[3,]    3    1    1    0    1
#------------------------------------
 colnames(recs) <- c(names(dat)[1] , 
                     paste("val_btwn", 
                            c(-100, -50, 0, 50, 100)[1:4], 
                            c(-100, -50, 0, 50, 100)[2:5], 
                            sep="_") )
 recs
#------------------------------------
     part_no val_btwn_-100_-50 val_btwn_-50_0 val_btwn_0_50 val_btwn_50_100
[1,]       1                 0              1             0               0
[2,]       2                 0              1             1               0
[3,]       3                 1              1             0               1

现在我想得更远,下次我可能会使用cutxtabs。事实上它工作得很好,我要把它贴在上面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多