繁体   English   中英

使用for循环创建子集(使用数据框的列)并查找另一列的唯一值

[英]creating subset (using a col of data frame) using for loop and finding unique values of another column

我是R的新手,并且一直坚持解决问题。 谁能指出我哪里出了问题我有以下数据*

   Score    TestID
   1536      2
   16000     18000
   1         15
   7         1800 
   738       256

有25000个测试ID,每个TestID都有一个相关的分数。 在这种情况下,分数的范围是0到16000。我需要绘制一个图表,显示在特定范围内存在的唯一TestID的数量,即

  ScoreRange      # of unique TestId
  0 - 16000              ?
  10 - 16000             ?
  20 - 16000             ?
     .                   . 
     .                   .

我编写了一个代码,其中我考虑的步长为10(对于范围),并找出该范围内的唯一TestID。 尽管我还没有准备好进行绘图,但是我仍在努力获取上述格式的输出。

    final <- matrix(0, ncol = 2, nrow = length(seq(1,max(Combined$Score),         
    10)))


     for (i in seq(1,max(df$Score), 10)) {
     comp <- subset(Combined, Score >= i)
     unik <- length(unique(comp$TestID))
     final[,c(1,2)] <- c(i,unik)

    }

对于final,我得到一个非常奇怪的输出,基本上是两个重复的值。 我要去哪里错了?

编辑:您的问题是,当您将for循环的结果写入“最终”矩阵时,您未指定将结果写入矩阵的哪一行。 为了解决这个问题,我创建了一个“计数器”变量,并在for循环之前将其设置为0,然后为循环的每次迭代添加1。 计数器指示将结果写入矩阵的哪一行。 尝试这个:

final <- matrix(0, ncol = 2, nrow = length(seq(0,max(Combined$Score),         
    10)))
counter<-0
for (i in seq(0,max(df$Score), 10)) {
  counter<-counter+1
  comp <- subset(df, Score >= i)
  unik <- length(unique(comp$TestID))
  final[counter,c(1,2)] <- c(i,unik)

}

您可能考虑的另一种解决方案是使用hist()生成直方图。 使用breaks参数可以为您提到的步长大小提供灵活性。 无论如何,我创建了一个迷你版的Combined作为示例:

Combined <- data.frame(Score = sample(0:16000,15),
                       TestID = sample(0:25000,15))
> Combined
   Score TestID
1  11456  14802
2  15854   1575
3  13738  22466
4   1659  14022
5  10671   4213
   ...    ...

Combined.hist <- hist(Combined$Score,
                      breaks = seq(0,16000))
final <- data.frame(Score = Combined.hist$breaks,
                    Counts = c(length(Combined[Combined$Score == 0]$Score),
                               Combined.hist$counts))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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