2017-03-17 82 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