2017-03-17 77 views
1

我,使用R語言有一個代碼,我要總結的所有數據幀(DF $數是不公開的結果在「RES」)ř編程薩姆數據幀

總結果爲= [1] 1 3 5 7 9 20 31 42

digits <- function(x){as.integer(substring(x, seq(nchar(x)), seq(nchar(x))))} 
generated <- function(x){ x + sum(digits(x))} 
digitadition <- function(x,N) { c(x, replicate(N-1, x <<- generated(x))) } 
res <- NULL 
for(i in 0:50){ 
for(j in 2:50){ 
tmp <- digitadition(i,j) 
IND <- 50*(i-1) + (j-1) - (i-1) #to index results 
res[IND] <- tmp[length(tmp)] 
} 
} 

df <- data.frame(number = unlist(res), generator=rep(1:50, each=49), N=2:50) 

total <- table(df$number)[as.numeric(names(table(df$number)))<=50] 

setdiff(1:50, as.numeric(names(total))) 

sum(total) 

我使用sum(total)但總結的結果是「155」是不正確的答案,使正確的答案是「118」

什麼spesific代碼總結總數'?

謝謝。

回答

0

我運行了你的代碼,我想你可能會對你想要總結的東西感到困惑。

setdiff包含的值1 3 5 7 9 20 31 42其總和爲118

所以,如果你做sum(setdiff(1:50, as.numeric(names(total)))),你會得到你正在尋找的118。


您的total變量與此不同。讓我解釋你在做什麼以及我認爲你應該做什麼。

您的代碼:total <- table(df$number)[as.numeric(names(table(df$number)))<=50]]

當你table(),你從向量中的每個獨特的價值,以及多少次出現在您的向量這個數目。

而當您獲得此表的names()時,您將這些唯一值分別設爲character,這就是爲什麼您要設置as.numeric

但是函數unique()爲你做這個工作,他從矢量中提取唯一值。

這裏是你可以做什麼:total <- unique(df$number[which(df$number <= 50)])

which()獲取值< = 50的ID的,和獨特的提取物,這些ID的獨特的價值觀。

最後:sum(setdiff(1:50, total))將所有從1到50的值都不在您的total向量中。

而在我看來,sum(setdiff(total, 1:50))其更直觀。

+0

謝謝TheBiro的答案,尤其是關於你的解釋使用unique()和哪個() – alexaxeel

+0

還記得當你想更新一個變量時,你必須使用'<-'像使用setdiff:'total < - setdiff (1:50,總數)'。當你只需要在控制檯上打印結果時,執行一個函數而不將它分配給一個變量是有用的。 – TheBiro