对于仅计算唯一值的循环

时间:2017-03-15 10:09:14

标签: r loops for-loop unique

我的数据框由以下列组成: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中的

'错误(唯一(df $ B_NUMBER)):长度为0的参数。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

由于您未提供示例数据,因此很难进一步检查for循环的内容。但根据错误消息,很明显1:nrow(unique(df$B_NUMBER))无效。函数unique返回vector,它是一维的。如果您将此vector作为nrow的输入,则会返回NULL。在这种情况下,您需要的是length,而不是nrow

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

答案 1 :(得分:0)

我理解您的问题的方式是,您正在寻找的是每个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!