【问题标题】:For loop that only counts unique values [closed]只计算唯一值的循环[关闭]
【发布时间】:2017-03-15 10:09:13
【问题描述】:

我的数据框由以下列组成:A_NUMBER, B_NUMBER, DURATION。我想计算A_NUMBER 调用不同的B_NUMBER 的次数(看看他们的网络有多大)。

我首先创建了一个新列,所有值都设置为 0。

df$CFU <- rep (0,nrow(df))

接下来,我尝试了以下 for 循环:

for (j in 1:nrow(df)){ for (i in 1:nrow(unique(df$B_NUMBER))){ 
   if(df$A_NUMBER[i] == df$A_NUMBER[j]) {df$CFU[j] <- sum(df$CFU[j],1)  }}}

然后我得到以下错误:

'1:nrow(unique(df$B_NUMBER)) 中的错误:长度为 0 的参数。

我应该如何解决这个问题?

【问题讨论】:

标签: r loops for-loop unique


【解决方案1】:

我理解您的问题的方式是,您正在寻找的是每个 A_NUMBER 的唯一 B_NUMBER 列表。

A_NUMBER = round(runif(100,0,10))
B_NUMBER = round(runif(100,0,10))
df = cbind(A_NUMBER, B_NUMBER)
aggregate(B_NUMBER ~ A_NUMBER, data=df, unique)

   A_NUMBER                   B_NUMBER
1         0                      10, 8
2         1           9, 3, 1, 7, 8, 0
3         2       7, 0, 6, 1, 9, 2, 10
4         3           7, 3, 6, 8, 4, 5
5         4 7, 9, 3, 10, 4, 8, 1, 2, 5
6         5                 6, 5, 2, 8
7         6          4, 8, 9, 6, 10, 3
8         7     7, 3, 6, 0, 4, 1, 9, 8
9         8              7, 9, 8, 5, 2
10        9        8, 6, 2, 9, 0, 4, 1
11       10                          7

然后你可以将向量的长度称为

aggregate(B_NUMBER ~ A_NUMBER, data=df, function(x) length(unique(x))

   A_NUMBER B_NUMBER
1         0        2
2         1        6
3         2        7
4         3        6
5         4        9
6         5        4
7         6        6
8         7        8  
9         8        5
10        9        7
11       10        1

检查是否正确

subset(df,A_NUMBER == 8)

       A_NUMBER B_NUMBER
 [1,]        8        7
 [2,]        8        9
 [3,]        8        7
 [4,]        8        8
 [5,]        8        5
 [6,]        8        7
 [7,]        8        2
 [8,]        8        2
 [9,]        8        8

看起来不错,只有7s、9s、8s、5s和2s!

【讨论】:

    【解决方案2】:

    由于您没有提供示例数据,因此很难进一步检查您的 for 循环发生了什么。但根据错误消息,很明显1:nrow(unique(df$B_NUMBER)) 不起作用。函数unique 返回一个vector,它是一维的。如果您将此vector 作为nrow 的输入,它将返回NULL。在这种情况下,您可能需要的是length,而不是nrow

    顺便说一下,df$CFU &lt;- rep(0, nrow(df))可以简化为df$CFU &lt;- 0

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2019-02-12
      • 2013-07-08
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多