我在R中寻找非常基本的数值函数digit sum。
- 我没有找到预安装的功能。
- 即使在Stackoverflow庞大的R库中,我也没有找到任何记录。
因此,尝试自己结束以下函数:
# Function to calculate a digit sum
digitsum = function (x) {sum(as.numeric(unlist(strsplit(as.character(x), split="")))) }
我在工作,但我仍在为以下两个问题而挣扎:
1.在普通的R中真的没有数字求和的函数吗?
1.有没有更聪明的方法来编写这个函数?
5条答案
按热度按时间mwngjboj1#
这样应该更好:
iswrvxsc2#
我想知道三种建议的方法(加上第四种)中哪一种最快,所以我做了一些基准测试。
digitsum1 <- function(x) sum(as.numeric(unlist(strsplit(as.character(x), split = ""))))
digitsum2 <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
1.使用GLDEX包中的函数digitsBase:
1.基于Greg Snow在R-help mailing list中的函数:
digitsum4 <- function(x) sum(x %/% 10^seq(0, length.out = nchar(x)) %% 10)
基准代码:
基准测试结果:
变体2比变体1稍快,而变体4和3慢得多,尽管变体4的代码看起来与变体2相似,但变体4的效率较低(但仍优于变体3)。
完整的基准测试结果(包括图表)在github上。
dpiehjr43#
我不知道为什么你会认为会有一个内置的函数来做这件事。它不是真正的统计操作。更多的是一种数论程序。(有很多例子可以通过搜索Rhelp档案找到。我使用Markmail来实现这个目的,但也有其他搜索引擎,如RSeek,GMane,还有纽卡斯尔的网页。你的函数会接受一系列的数字,然后返回一个数字,这个数字是所有数字的总和。如果这是目标,那么它看起来设计得很合理。我猜人们会想要每个数字的总和:
在pkg:GLDEX中有一个“数字化”函数digitsBase,您可以将您的as.numeric(unlist(split(as.character(x),"”)))替换为该函数:
fjnneemd4#
求R中数字和的方法是:
dhxwm5r45#
你可以用
x %% 10L
得到最后一位数,用x %% 10L
去掉最后一位数,这样做,然后在一个循环中用floor(log10(max(x)))
重复对最后一位数求和,就给予了结果。在C++中使用RCPP也是如此。
基准(摘自@Uwe)