我分析来自许多城市的测量数据(数百个),并且需要为每个城市创建单独的报告(采用Adobe pdf格式).
我的过程是这样的:
这非常繁琐,看起来非常适合每个城市的循环,但它怎么能完成呢?
谢谢r-contributors!
/克里斯
我收到了带有要在R中分析的数据的json文件,为此我使用了RJSONIO包:
library(RJSONIO)
filename <- "Indata.json"
jFile <- fromJSON(filename)
Run Code Online (Sandbox Code Playgroud)
当json文件大于约300MB(未压缩)时,我的计算机开始使用交换内存并继续解析(fromJSON)数小时.一个200MB的文件只需要一分钟就可以解析.
我在Ubuntu 64bit和16GB RAM上使用R 2.14(64位),所以我很惊讶需要交换大约300MB的json.
我怎么能读大jsons?内存设置中有什么东西搞砸了吗?我重新启动了R并且只运行了上面的三行.json文件包含2-3列短字符串,10-20列包含0到1000000之间的数字.也就是说,它是大小的行数(在解析数据中超过一百万行).
更新:从评论中我了解到rjson在C中完成的更多,所以我试了一下.带有RJSONIO(根据Ubuntu系统监视器)的300MB文件达到了100%的内存使用率(从6%基线开始)并继续进行交换,只需要60%的内存和rjson包,并且在合理的时间(分钟)内完成解析.
我需要在现有表中添加许多大表,所以我使用rbind和优秀的包data.table.但是后面的一些表有比原始列更多的列(需要包含它们).是否有相当于data.table的rbind.fill?
library(data.table)
aa <- c(1,2,3)
bb <- c(2,3,4)
cc <- c(3,4,5)
dt.1 <- data.table(cbind(aa, bb))
dt.2 <- data.table(cbind(aa, bb, cc))
dt.11 <- rbind(dt.1, dt.1) # Works, but not what I need
dt.12 <- rbind(dt.1, dt.2) # What I need, doesn't work
dt.12 <- rbind.fill(dt.1, dt.2) # What I need, doesn't work either
Run Code Online (Sandbox Code Playgroud)
我需要在拥有所有表之前开始rbinding,因此无法知道将来会调用哪些新列.缺少的数据可以用NA填充.
我需要通过start-row和end-row标准来识别data.table中的行块.在下面的MWE中,起始行由colA =="d"定义,并且该组继续直到colA =="a"
library(data.table)
in.data <- data.table(colA=c("b", "f", "b", "k", "d", "b", "a", "s", "a", "n", "d", "f", "d", "a", "t"))
in.data$wanted.column <- c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 2, 2, 2, 2, NA)
in.data
# colA wanted.column
# 1: b NA
# 2: f NA
# 3: b NA
# 4: k NA
# 5: d 1
# 6: b 1
# 7: a 1
# 8: s NA
# 9: a NA
# 10: …Run Code Online (Sandbox Code Playgroud) 如何在reveal.js和Rmarkdown中使用优秀的htmlwidgets(例如http://rstudio.github.io/leaflet/)?
这个mwe(不是reveal.js)有效:
---
title: "Maptest 1"
output: html_document
---
## Map
```{r, echo=FALSE}
library(leaflet)
m <- leaflet()
m <- addTiles(m)
m <- addMarkers(m, lng=174.768, lat=-36.852, popup="The birthplace of R")
m
```
Run Code Online (Sandbox Code Playgroud)
但是这个没有:
---
title: "Maptest 2"
output: revealjs::revealjs_presentation
---
## Map
```{r, echo=FALSE}
library(leaflet)
m <- leaflet()
m <- addTiles(m)
m <- addMarkers(m, lng=174.768, lat=-36.852, popup="The birthplace of R")
m
```
Run Code Online (Sandbox Code Playgroud)
我重新使用了htmlwidgets-webpage中的示例,reveal.js-template来自https://github.com/jjallaire/revealjs
不确定如何用单词表达问题,但是如何为data.table创建一个索引列,当出现不同的值时,每个组会增加?
这是MWE
library(data.table)
in.data <- data.table(fruits=c(rep("banana", 4), rep("pear", 5)),vendor=c("a", "b", "b", "c", "d", "d", "e", "f", "f"))
Run Code Online (Sandbox Code Playgroud)
这是R代码应该生成的结果
in.data[, wanted.column:=c(1,2,2,3,1,1,2,3,3)]
# fruits vendor wanted.column
# 1: banana a 1
# 2: banana b 2
# 3: banana b 2
# 4: banana c 3
# 5: pear d 1
# 6: pear d 1
# 7: pear e 2
# 8: pear f 3
# 9: pear f 3
Run Code Online (Sandbox Code Playgroud)
因此它在每个水果中标记每个供应商1,2,3,.... 可能有一个非常简单的解决方案,但我被卡住了.
我使用的一些数据包含敏感信息(人员姓名,日期,地点等).但我有时需要与其他人分享"数字"以获得统计分析的帮助,或者在更强大的机器上处理它,在那里我无法控制谁看数据.
理想情况下,我想这样工作:
我认为这在上传数据以便"在云端"(亚马逊等)进行处理时也很有用.
你有过这种情况吗?我首先想到自己编写一个"随机化"功能,但后来我意识到这可以做到多么复杂(例如,在不丢失顺序的情况下抵消时间戳).也许已经有一个定义的方法或工具?
感谢所有在Stack Overflow为[r] -tag做出贡献的人!
我对很远的行业级数据库进行了很多SQL查询,但接收结果需要很长时间.当我带R的计算机几乎紧挨着数据库时,速度要快得多,这让我相信它是我的计算机和数据库之间的延迟,这是瓶颈,并且运行并行查询可能会加快速度.我们在不同的大陆.
这是一个不平行的工作版本:
doQueries <- function(filenameX, inp1, inp2) {
print(paste("Starting:", inp1, inp2, ",saving to", filenameX, sep=" "))
# Here should the query be (using RODBC)
# save(queryresults, file="filenameX")
}
input.rows <- cbind(c("file1.rda","file2.rda","file3.rda"),c("A","B","C"),c(12,13,14))
for (i in 1:nrow(input.rows)) {
doQueries(filenameX=input.rows[i,1], inp1=input.rows[i,2], inp2=input.rows[i,3])
}
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下代码,但foreach-library似乎并不可用,正如我从阅读CRAN时所理解的那样,并行正在替换早期的并行软件包("package'foreach'不可用(对于R版本2.15). 0)").
library(parallel)
library(foreach)
foreach (i=1:nrow(input.rows)) %dopar% {
doQueries(filenameX=input.rows[i,1], inp1=input.rows[i,2], inp2=input.rows[i,3])
}
Run Code Online (Sandbox Code Playgroud)
我应该怎么做呢?
感谢Stackoverflow上的所有贡献者!
/克里斯
更新:感谢nograpes,我设法加载库.以下代码似乎有效:
library(RODBC)
library(doParallel)
library(foreach)
# odbcCloseAll()
# my_conn <- odbcConnect("database", uid="xx", pwd="yy", case="nochange")
doQueries <- function(filenameX, inp1, inp2) {
print(paste("Starting:", inp1, inp2, ",saving to", filenameX, …Run Code Online (Sandbox Code Playgroud) 我是 R 中面向对象编程的新手,并且正在努力解决如何正确编写修改对象的函数。
这个例子有效:
store1 <- list(
apples=3,
pears=4,
fruits=7
)
class(store1) <- "fruitstore"
print.fruitstore <- function(x) {
paste(x$apples, "apples and", x$pears, "pears", sep=" ")
}
print(store1)
addApples <- function(x, i) {
x$apples <- x$apples + i
x$fruits <- x$apples + x$pears
return(x)
}
store1 <- addApples(store1, 5)
print(store1)
Run Code Online (Sandbox Code Playgroud)
但我想应该有一种更干净的方法来做到这一点而不返回整个对象:
addApples(store1, 5) # Preferable line...
store1 <- addApples(store1, 5) # ...instead of this line
Run Code Online (Sandbox Code Playgroud)
在 R 中编写修改函数的正确方法是什么?“<<-”?
更新:感谢大家为 R 中的 OOP 编写的 Rosetta Stone。内容非常丰富。我试图解决的问题在流程方面非常复杂,因此参考类的刚性可能会给结构带来帮助。我希望我可以接受所有回复作为答案,而不仅仅是一个。
我有多个间隔,需要找出哪些间隔会形成一个连续的组。
在此MWE中,我具有Interval.id,Interval.start和Interval.end。我想计算Wanted.column。
DT <- data.table(Interval.id=c(1L, 2L, 3L, 4L, 5L, 6L),
Interval.start=c(2.0, 3.0, 4.0, 4.6, 4.7, 5.5),
Interval.end=c(4.5, 3.5, 4.8, 5.0, 4.9, 8.0),
Wanted.column=c(1L, 1L, 1L, 1L, 1L, 2L))
Run Code Online (Sandbox Code Playgroud)
我想foverlaps是这里的朋友,但我不知道如何。
如何计算Wanted.column?