R编程 - 计算某一数字范围的出现次数

问题描述 投票:3回答:4

你们能帮忙得到特定范围的“数量”吗?例如,我想知道得分为0.5比1,1,1.5,2.0到2.5的次数等等。我有一个样本数据如下。

  Times Scores
    0   0.6
    1.2 0.5
    1.8 1.2
    2.4 1.4
    3   1.5
    3.6 2
    4.2 0.5
    4.8 0.6
    5.4 0.4
    6   1
    6.6 1.1
    8   0.6
    9.4 1.5
    10.8    1.5
    12.2    1.3
    13.6    1.6
    15  1.4
    16.4    1.2
    17.8    1.4
    19.2    2.6
    20.6    2
    22  2.2
    23.4    2.4
    24.8    1.4
    26.2    1.2
    27.6    0.5
    29  0.8
    30.4    1.4
    31.8    1.6
    33.2    2.2
    34.6    2.5
    36  3.6
    37.4    3.78
    38.8    2.5
    40.2    3.5
    41.6    3.4
    43  3.5
    44.4    3.3
    45.8    2.1
    47.2    2.3
    48.6    0.6
    50  0.7
    51.4    0.8
    52.8    1.4
    54.2    1.5
    55.6    1.6
    57  1.5
    58.4    1.2
    59.8    1.1
    61.2    1.56
    62.6    2.02
    64  2.48
    65.4    2.94
    66.8    3.4
    68.2    2.1
    69.6    2.8
    71  3.9
    72.4    2.3
    73.8    2.4
    75.2    5.5
    76.6    4.6
    78  1.2
    79.4    1.3
    80.8    1.4
    82.2    1.8
    83.6    0.5
    85  0.2
    86.4    0.3
    87.8    0.6
    89.2    0.4
    90.6    0.5
    92  0.6
    93.4    1.06
    94.8    1.52
    96.2    1.98
    97.6    2.44
    99  2.9
    100.4   3.36
    101.8   3.82
    103.2   0.6
    104.6   0.5
    106 1.2
    107.4   1.4
    108.8   1.5
    110.2   2
    111.6   0.5
    113 0.6
    114.4   0.4
    115.8   1
    117.2   1.1
    118.6   0.6
    120 1.5
    121.4   1.5
    122.8   1.3
    124.2   1.76
    125.6   2.22
    127 2.68
    128.4   3.14
    129.8   3.6
    131.2   4.06
    132.6   4.52
    134 4.98
    135.4   5.44
    136.8   5.9
    138.2   6.36
    139.6   6.82
    141 0.6
    142.4   0.5
    143.8   1.2
    145.2   1.4
    146.6   1.5
    148 2
    149.4   0.5
    150.8   0.6
    152.2   0.4
    153.6   1
    155 1.1
    156.4   0.6
    157.8   1.5
    159.2   1.5
    160.6   1.3
    162 1.76
    163.4   2.22
    164.8   2.68
    166.2   3.5
    167.6   3.3
    169 2.1
    170.4   2.3
    171.8   0.6
    173.2   0.7
    174.6   0.8
    176 1.4
    177.4   1.5
    178.8   1.6
    180.2   1.5
    181.6   1.2
    183 1.1
    184.4   0.5
    185.8   0.6
    187.2   0.1
    188.6   0.8
    190 0.5
    191.4   0.6
    192.8   0.3
    194.2   0.5
    195.6   1.5
    197 1.8
    198.4   2
    199.8   2.2

我想把我的'Times'专栏分成15个bin区间,我可以做。我使用的代码是下面的代码

Data = cut(Sampledata$Times, seq(0,200, by=15), right=FALSE)
finaldata <- by(Sampledata, Data, FUN=I)  

但是现在我想知道如何获得每15个bin间隔的不同分数范围的计数我想要的分数范围是:每15个bin间隔0.5到1,1到1.5,2.0到2.5

谢谢你们...任何建议都将不胜感激

r count range
4个回答
2
投票

这里有一个使用by的解决方案,正如你试图做的那样,但我用自定义函数替换了身份函数。对于每个时间间隔,我使用cut将得分范围划分为区间,并使用tapply计算每个得分区间的长度。使用rbind.将all转换为矩阵

do.call(rbind,by(Sampledata, Data, FUN=function(x){
  tapply(x$Scores,
         cut(x$Scores,c( 0.5,1,1.5, 2.0 ,2.5)),
          length)
}))

         (0.5,1] (1,1.5] (1.5,2] (2,2.5]
[0,15)          4       7       2      NA
[15,30)         1       5       1       2
[30,45)        NA       1       1       3
[45,60)         3       5       1       2
[60,75)        NA      NA       1       5
[75,90)         1       3       1      NA
[90,105)        2       1       2       1
[105,120)       3       4       1      NA
[120,135)      NA       3       1       1
[135,150)       1       3       1      NA
[150,165)       3       4       1       1
[165,180)       3       2       1       2
[180,195)       3       3      NA      NA

1
投票

我不太确定你想要什么,把你的数据读到R并不是那么容易,但概念应该是:

让我们假设data包含你的数字,而U是你的区间的向量,那么

set.seed(123);
data <- rnorm(1e3);
U <- c(0.5,1,1.5,2,2.5);
counts <- numeric(length(U)-1);
for(i in 1:length(counts)) {
    counts[i] <- length(which(data>=U[i] & data<U[i+1]));
}

counts
[1] 146  83  46  22

应该做的伎俩。


1
投票

如果我理解你的问题,这是一个简单的解决方案:

table(cut(YOURDATA, breaks = seq.int(from = 0.5, to = 2.5, by = 0.5)))


0
投票

你可以像这样定义一个布尔矢量:

a<-rep(F,length(Scores))
for (j in 1:length(Scores))
{
    if(0.5<Scores[j] && 1>=Scores[j])
a[j]<-T
}

并使用函数sum()来计算它的真实时间:

nb0.5to1<-sum(a)

并为其他人进行同样的干预。如果您不想每次重复定义,则可以使用函数seq()。

© www.soinside.com 2019 - 2024. All rights reserved.