1. 首页
  2. R语言

【学习】笨办法学R编程(三)

看到各位对“笨办法系列”的东西还比较感兴趣,我也很乐意继续写下去。今天的示例将会用到数据框(data.frame)这种数据类型,并学习如何组合计算两个向量,以及如何排序。我们将用所学的东西来解决Project Euler的第四个问题,就是找出一个集合中最大的回文数。回文数是指一个像1534351这样“对称”的数,如果将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。开始啦!

# 预备练习x <- y <- 1:9data <- expand.grid(x=x,y=y)print(data)z <- data$x * data$y# 一个九九乘法表z <- matrix(z,ncol=9)set.seed(1)x <- round(runif(10),2)print(x)order(x)x[order(x)[1]]which.min(x)x[which.min(x)]x[order(x)]y <- 1:10data <- data.frame(x,y)class(data)head(data)data[1,]data[,1]data$xdata[order(data$x),]# Project Euler 4# 在两个三位数字的乘积中,找出最大的回文数# 先建立一个将数字顺序进行反转的函数reverse <- function(n) {reversed <- 0while (n > 0) {reversed <- 10 * reversed + n %% 10n <- n%/%10}return(reversed)}# 从大到小搜索回文数x <- y <- 999:100data <- expand.grid(x=x,y=y)data$prod <- data$x * data$ydata <- data[order(data$prod,decreasing=T),]head(data)value <- data$prod for (i in 1:length(value)) { isequal <- (value[i] == reverse(value[i])) if (isequal) { print(data[i,]) break }} 得到的结果是906609,本例是先将乘积排序后再判断是否回文数,找到的第一个就是答案,所以速度会快一点。如果不用expand.grid函数的话,可以利用嵌套for来组合计算。另外还有一种作法是利用R本身的rev函数,先将数字转为字符,再切开成一串向量,用rev反转后判断。

原文始发于微信公众号(PPV课数据科学社区):【学习】笨办法学R编程(三)

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/31307

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息