2017-03-15 164 views
0

我的數據框由以下列組成:A_NUMBER, B_NUMBER, DURATION。我想計算A_NUMBER調用不同的B_NUMBER(查看它們的網絡有多大)的次數。For循環僅計算唯一值

我第一次創建與設定爲等於所有值的新列0

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

接下來,我嘗試了循環如下:

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) }}} 

然後我得到以下錯誤:

'error in 1:nrow(unique(df$B_NUMBER)): argument of length 0.

我應該如何解決這個問題?

+2

請給出一個可重現的例子!閱讀[問]和[mcve] ...然後編輯你的問題:http://stackoverflow.com/posts/42806592/edit – jogo

+0

錯誤提出,因爲你要求的矢量行數(nrow(獨特(df $ B_NUMBER))。但除此之外,我不確定我是否理解你想達到的效果。你在尋找倒排索引嗎? – Adam

回答

0

我明白你的問題的方式是,你正在尋找的是每個A_NUMBER獨特B_NUMBERs的列表。

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 

看起來不錯,只有7秒,787-9,787-8,5S和2s!

0

因爲您沒有提供示例數據,所以很難進一步檢查您的for循環發生了什麼。但根據錯誤消息,很明顯1:nrow(unique(df$B_NUMBER))不起作用。函數unique返回一維的vector。如果您輸入此vector作爲nrow的輸入,它將返回NULL。在這種情況下,您可能需要的是length,而不是nrow

順便說一句,df$CFU <- rep(0, nrow(df))可以簡化爲df$CFU <- 0