小编www*_*www的帖子

R中的缓存/记忆/散列选项

我试图找到一种简单的方法来使用像R中的Perl的散列函数(基本上是缓存),因为我打算进行Perl风格的散列并编写我自己的计算备忘录.然而,其他人已经打败了我,并有包装备忘.我越挖,越我发现,如memoiseR.cache,但差异不容易明确.另外,目前还不清楚如何使用Perl风格的哈希(或Python风格的词典)并编写一个自己的memoization,而不是使用hash包,这似乎不是两个memoization包的基础.

由于我无法找到有关CRAN或其他地方的信息来区分选项,或许这应该是关于SO的社区维基问题:R中的记忆和缓存有哪些选项,它们的区别是什么?


作为比较的基础,这里是我找到的选项列表.此外,在我看来,所有都依赖于散列,所以我也会注意到散列选项.密钥/值存储在某种程度上是相关的,但是会打开关于数据库系统的大量蠕虫(例如BerkeleyDB,Redis,MemcacheDB和其他许多人).

它看起来像是:

哈希

  • 摘要 - 为任意R对象提供散列.

记忆化

  • memoise - 用于记忆功能的非常简单的工具.
  • R.cache - 为memoization提供了更多功能,虽然看起来有些功能缺少示例.

高速缓存

  • hash - 提供类似于Perl的哈希和Python字典的缓存功能.

键/值存储

这些是R对象外部存储的基本选项.

检查点

其他

  • Base R支持:命名向量和列表,数据框的行和列名称以及环境中项目的名称.在我看来,使用列表有点像kludge.(也有pairlist,但已被弃用.)
  • 所述data.table包支持在一个数据表元素的快速查找.

用例

虽然我最感兴趣的是了解选项,但我有两个基本用例:

  1. 缓存:简单计算字符串.[注意:这不适用于NLP,但一般用途,因此NLP库是过度的; 表格不合适,因为我不想等到整个字符串集加载到内存中.Perl风格的哈希处于适当的实用水平.]
  2. 记忆怪异的计算.

这些真的出现了,因为我正在深入研究一些slooooow代码的分析,我真的只想计算简单的字符串,看看我是否可以通过memoization加速一些计算.能够散列输入值,即使我没有记忆,也会让我看看memoization是否有帮助.


注1:可重复研究CRAN任务视图列出了几个软件包(cacherR.cache),但没有详细说明使用选项.

注2:为了帮助其他人查找相关代码,这里有一些关于一些作者或包的注释.一些作者使用SO.:)

  • Dirk Eddelbuettel: …

hash caching r memoization memoise

69
推荐指数
2
解决办法
1万
查看次数

找到r中某个纬度/经度距离内的位置

我有一个网格化数据集,可在以下位置获得数据:

lon <- seq(-179.75,179.75, by = 0.5)
lat <- seq(-89.75,89.75, by = 0.5)
Run Code Online (Sandbox Code Playgroud)

我想找到位于该位置500公里范围内的所有数据点:

mylat <- 47.9625
mylon <- -87.0431
Run Code Online (Sandbox Code Playgroud)

我的目标是在R中使用geosphere包,但我目前编写的方法效率似乎不高:

require(geosphere)
dd2 <- array(dim = c(length(lon),length(lat)))
for(i in 1:length(lon)){
  for(ii in 1:length(lat)){
    clon <- lon[i]
    clat <- lat[ii]
    dd <- as.numeric(distm(c(mylon, mylat), c(clon, clat), fun = distHaversine))
    dd2[i,ii] <- dd <= 500000
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我循环遍历数据中的每个网格,并查找距离是否小于500 km.然后我存储一个TRUE或FALSE变量,然后我可以使用它来平均数据(其他变量).从这个方法,我想要一个TRUE或FALSE的矩阵,用于距离lat和lon 500公里范围内的位置.有没有更有效的方法来做到这一点?

r geosphere

19
推荐指数
2
解决办法
1675
查看次数

R包重构函数熔化错误:在处理大量因素时,数据中找不到id变量

我正在处理来自mothur的稀疏输出,它基本上给我一个数据集,其中包含采样的序列数和几个样本中的唯一序列数.我想使用ggplot2来可视化这些数据,因此需要使用melt从a widelong格式.

问题是我发现由于错误导致无法完成这项工作melt.这基本上说明了

错误:数据中找不到id变量:1,3,6,(...等等)

由于原始数据集的大小,在此处共享它将是不切实际的,但是应该能够使用以下代码重新创建相同的问题:

a<-seq(0,300,3)
b<-runif(length(a))
c<-runif(length(a))
d<-as.data.frame(cbind(a,b,c))
d$a<-as.factor(d$a)
melt(d,d$a)
Run Code Online (Sandbox Code Playgroud)

这给出了完全相同的错误:

错误:数据中找不到id变量:0,3,6,9,(...)

我没有看到我做错了什么.我在ubuntu服务器12.04上使用R 2.15.1.功能reshape::meltreshape2::melt结果都是相同的错误.

r reshape melt mothur

15
推荐指数
1
解决办法
3万
查看次数

如何使用purrr :: pmap在nested.data.frame中绘制多个ggplot

我有一些关于purrr :: pmap的问题,可以在nested.data.frame中制作多个ggplot图.

我可以通过使用purrr :: map2在代码下运行而没有问题,我可以在nested.data.frame中创建多个图(2个图).

作为一个例子,我在R中使用了虹膜数据集.

library(tidyverse)

iris0 <- iris
iris0 <-
iris0 %>%  
group_by(Species) %>%  
nest() %>%  
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(g = purrr::map2(gg1, gg2, ~ gridExtra::grid.arrange(.x, .y)))
Run Code Online (Sandbox Code Playgroud)

但是,当我想绘制超过2个图时,我无法解决使用purrr :: pmap,如下面的代码.

iris0 <-  
iris0 %>%  
group_by(Species) %>%  
nest() %>%  
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>%
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>%
mutate(gg3 = purrr::map(data, …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 purrr

15
推荐指数
1
解决办法
2256
查看次数

Python相当于R的集群包中的daisy()

我有一个包含分类(名义和序数)和数字属性的数据集.我想使用这些混合属性在我的观察中计算(dis)相似性矩阵.使用R中集群包的daisy()函数,我可以很容易地获得如下的相异矩阵:

if(!require("cluster")) { install.packages("cluster");  require("cluster") }
data(flower)
as.matrix(daisy(flower, metric = "gower"))
Run Code Online (Sandbox Code Playgroud)

这使用gower度量来处理名义变量.是否有一个Python相当于daisy()R 中的函数?

或者也许任何其他模块函数允许使用Gower指标或类似的东西计算具有混合(名义,数字)属性的数据集的(dis)相似性矩阵?

python r similarity categorical-data r-daisy

12
推荐指数
2
解决办法
8489
查看次数

如何在R中的read_html之后关闭未使用的连接

我是R的新手,我试图访问互联网上的一些信息,但我遇到了似乎没有关闭的连接问题.如果有人在这里给我一些建议,我将非常感激...

最初我想使用WebChem软件包,理论上可以提供我想要的所有内容,但是当网页中缺少某些输出数据时,WebChem不会从该页面返回任何数据.为了解决这个问题,我已经从包中获取了大部分代码,但稍微改了一下以满足我的需求.这工作得很好,关于第150个惯例,但现在,我虽然什么都没有改变,当我使用命令read_html,我得到的警告信息"关闭不使用的连接4(HTTP:......"虽然这只是一条警告消息,read_html在生成此警告后不返回任何内容.

我写了一个简化的代码,如下所示.这有同样的问题

完全关闭R(甚至重新启动我的电脑)似乎没有什么区别 - 第二次使用代码时会出现警告消息.我可以一次一个地运行查询,在循环之外没有问题,但是一旦我尝试使用循环,错误就会在第二次迭代时再次发生.我试图矢量化代码,并再次返回相同的错误消息.我尝试了showConnections(all = TRUE),但只有stdin,stdout,stderr的连接0-2.我试图找到关闭html连接的方法,但是我不能将url定义为con,而close(qurl)和close(ttt)也不起作用.(返回应用于类"字符"对象的'close'没有适用方法的错误,并且没有适用于类'c('xml_document','xml_node')的对象的'close'的适用方法",分别)

有没有人知道关闭这些连接的方法,这样他们就不会破坏我的日常工作?任何建议都会非常受欢迎.谢谢!

PS:我正在使用R版本3.3.0和RStudio版本0.99.902.

CasNrs <- c("630-08-0","463-49-0","194-59-2","86-74-8","148-79-8")
tit = character()
for (i in 1:length(CasNrs)){
  CurrCasNr <- as.character(CasNrs[i])
  baseurl <- 'http://chem.sis.nlm.nih.gov/chemidplus/rn/'
  qurl <- paste0(baseurl, CurrCasNr, '?DT_START_ROW=0&DT_ROWS_PER_PAGE=50')
  ttt <- try(read_html(qurl), silent = TRUE)
  tit[i] <- xml_text(xml_find_all(ttt, "//head/title"))
}
Run Code Online (Sandbox Code Playgroud)

r rvest webchem

12
推荐指数
2
解决办法
2698
查看次数

R中的Riverplot包 - 输出图以网格线或轮廓覆盖

我在R Riverplot中制作了一个Sankey图(v0.5),在RStudio中输出看起来很小,但是当导出或放大时,颜色有黑色轮廓或网格线.

这里链接的Riverplot图像显示了问题

我想这可能是因为形状的轮廓与我想用于填充的透明度不匹配?

我可能需要找到一种方法来完全摆脱轮廓(而不是让它们半透明),因为我认为它们也是为什么值为零的流仍然显示为细线的原因.

我的代码在这里:

#loading packages
library(readr)
library("riverplot", lib.loc="C:/Program Files/R/R-3.3.2/library")
library(RColorBrewer)

#loaing data
Cambs_flows <- read_csv("~/RProjects/Cambs_flows4.csv")

#defining the edges
edges = rep(Cambs_flows, col.names = c("N1","N2","Value"))
edges    <- data.frame(edges)
edges$ID <- 1:25

#defining the nodes
nodes <- data.frame(ID = c("Cambridge","S Cambs","Rest of E","Rest of UK","Abroad","to Cambridge","to S Cambs","to Rest of E","to Rest of UK","to Abroad"))
nodes$x = c(1,1,1,1,1,2,2,2,2,2)
nodes$y = c(1,2,3,4,5,1,2,3,4,5)

#picking colours
palette = paste0(brewer.pal(5, "Set1"), "90")

#plot styles
styles = lapply(nodes$y, function(n) {
  list(col = palette[n], lty = …
Run Code Online (Sandbox Code Playgroud)

r sankey-diagram riverplot

11
推荐指数
2
解决办法
2390
查看次数

如何在R中的连续行中对滚动的cumsum进行滚动

我有一个玩具的例子.对由x组成的两个连续y行进行求和的最有效方法是什么


library(tibble)
l = list(x = c("a", "b", "a", "b", "a", "b"), y = c(1, 4, 3, 3, 7, 0))

df <- as_tibble(l)
df
#> # A tibble: 6 x 2
#>       x     y
#>   <chr> <dbl>
#> 1     a     1
#> 2     b     4
#> 3     a     3
#> 4     b     3
#> 5     a     7
#> 6     b     0
Run Code Online (Sandbox Code Playgroud)

所以输出就是这样的

   group   sum  seq
     a      4     1
     a     10     2
     b      7     1
     b      3     2
Run Code Online (Sandbox Code Playgroud)

我想使用RcppRoll包中的tidyverse和可能的roll_sum()并使用代码,以便可变长度的连续行可以用于真实世界数据,其中会有很多组

TIA

r tidyverse tibble

11
推荐指数
3
解决办法
902
查看次数

将数据集中的每个单元格除以 R 中的列总和

我试图将数据框中的每个单元格除以列的总和。例如,我有一个数据框 df:

sample   a   b   c
a2      1    4    6
a3      5    5    4
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的数据框,将每个单元格放入并除以列的总和,如下所示:

sample   a   b   c
a2      .167  .444  .6
a3      .833  .556  .4
Run Code Online (Sandbox Code Playgroud)

我已经使用sweep() 看到了答案,但这看起来像是用于矩阵,而且我有数据框。我了解如何使用 colSums(),但我不确定如何编写一个函数来循环遍历列中的每个单元格,然后除以列总和。谢谢您的帮助!

r dataframe

10
推荐指数
2
解决办法
8845
查看次数

R:RStudio:如何让剪影图工作?

今天我已经意识到包装中的silhouette图形cluster无法正确显示RStudio.Google搜索显示其他人遇到此问题:

http://support.rstudio.org/help/discussions/problems/3094-plotsnot-showing-up-in-r-studio

作为R的新手,我不清楚这个问题是否已在这个问题得到解决!所以我的问题是:有没有办法让silhouette情节正确显示RStudio

谢谢你的帮助.

示例脚本:

library(cluster)
data(xclara)
km <- kmeans(xclara,3)
dissE <- daisy(xclara)
sk <- silhouette(km$cl, dissE)
plot(sk)
Run Code Online (Sandbox Code Playgroud)

r cluster-analysis r-daisy

8
推荐指数
1
解决办法
1万
查看次数