我最近遇到了python 的pandas库,根据这个基准测试执行非常快速的内存中合并.它甚至比R中的data.table包更快(我选择用于分析的语言).
为什么pandas
这么快data.table
?是因为python具有超过R的固有速度优势,还是有一些我不知道的权衡?有没有办法在data.table
不诉诸merge(X, Y, all=FALSE)
和执行内部和外部联接的情况下merge(X, Y, all=TRUE)
?
我有以下数据(temp.dat
请参阅完整数据的结束注释)
Year State Capex
1 2003 VIC 5.356415
2 2004 VIC 5.765232
3 2005 VIC 5.247276
4 2006 VIC 5.579882
5 2007 VIC 5.142464
...
Run Code Online (Sandbox Code Playgroud)
我可以生成以下图表:
ggplot(temp.dat) +
geom_line(aes(x = Year, y = Capex, group = State, colour = State))
Run Code Online (Sandbox Code Playgroud)
而不是传说,我喜欢标签
我在以下链接的答案中注意到了baptiste的评论,但是当我尝试调整他的代码(geom_text(aes(label = State, colour = State, x = Inf, y = Capex), hjust = -1)
)时,文本没有出现.
temp.dat <- structure(list(Year = c("2003", "2004", "2005", "2006", "2007",
"2008", "2009", "2010", "2011", "2012", "2013", …
Run Code Online (Sandbox Code Playgroud) 当我在本地数据框中有一个列时,有时我得到的消息Variables not shown
就像这个(荒谬的)示例只需要足够的列.
library(dplyr)
library(ggplot2) # for movies
movies %.%
group_by(year) %.%
summarise(Length = mean(length), Title = max(title),
Dramaz = sum(Drama), Actionz = sum(Action),
Action = sum(Action), Comedyz = sum(Comedy)) %.%
mutate(Year1 = year + 1)
year Length Title Dramaz Actionz Action Comedyz
1 1898 1.000000 Pack Train at Chilkoot Pass 1 0 0 2
2 1894 1.000000 Sioux Ghost Dance 0 0 0 0
3 1902 3.555556 Voyage dans la lune, Le 1 0 0 2
4 …
Run Code Online (Sandbox Code Playgroud) 如何在ggplot中不对称地调整限制的扩展?例如,
library(ggplot2)
ggplot(mtcars) +
geom_bar(aes(x = cyl), width = 1)
Run Code Online (Sandbox Code Playgroud)
我希望条形图的底部与面板背景的底部齐平,但仍然需要顶部的空间.我可以使用空白注释来实现此目的:
ggplot(mtcars) +
geom_bar(aes(x = cyl), width = 1) +
annotate("blank", x = 4, y = 16) +
scale_y_continuous(expand = c(0.0,0))
Run Code Online (Sandbox Code Playgroud)
ggplot
但是,在以前的版本中,我可以使用Rosen Matev提供的解决方案:
library("scales")
scale_dimension.custom_expand <- function(scale, expand = ggplot2:::scale_expand(scale)) {
expand_range(ggplot2:::scale_limits(scale), expand[[1]], expand[[2]])
}
scale_y_continuous <- function(...) {
s <- ggplot2::scale_y_continuous(...)
class(s) <- c('custom_expand', class(s))
s
}
Run Code Online (Sandbox Code Playgroud)
然后使用scale_y_continuous(expand = list(c(0,0.1), c(0,0)))
会在图表顶部添加一致的附加内容.但是,在当前版本中,我收到错误
ggplot(mtcars) +
geom_bar(aes(x = cyl), width = 1) +
scale_y_continuous(expand = list(c(0,0.1), c(0,0))) …
Run Code Online (Sandbox Code Playgroud) 在最新版本中ggplot2
,?fortify
返回:
描述
我现在推荐使用扫帚 包,而不是使用这个功能,它实现了更广泛的方法.
fortify
可能会在将来弃用.
该broom
软件包确实提供了许多替代方案(例如augment
).在什么情况下应该使用哪一个?
我在替代特别感兴趣的fortify(spdf)
地方spdf
是一个SpatialPolygonsDataFrame.
grid.arrange
在gridExtra
包中使用相对简单的方法在矩阵中排列多个图,但是ggplot2
当一些图比其他图更大时,如何安排图(我正在处理的图)?在基础上,我可以使用layout()
如下例子:
nf <- layout(matrix(c(1,1,1,2,3,1,1,1,4,5,6,7,8,9,9), byrow=TRUE, nrow=3))
layout.show(nf)
Run Code Online (Sandbox Code Playgroud)
ggplot
情节的等价物是什么?
包含的一些情节
library(ggplot2)
p1 <- qplot(x=wt,y=mpg,geom="point",main="Scatterplot of wt vs. mpg", data=mtcars)
p2 <- qplot(x=wt,y=disp,geom="point",main="Scatterplot of wt vs disp", data=mtcars)
p3 <- qplot(wt,data=mtcars)
p4 <- qplot(wt,mpg,data=mtcars,geom="boxplot")
p5 <- qplot(wt,data=mtcars)
p6 <- qplot(mpg,data=mtcars)
p7 <- qplot(disp,data=mtcars)
p8 <- qplot(disp, y=..density.., geom="density", data=mtcars)
p9 <- qplot(mpg, y=..density.., geom="density", data=mtcars)
Run Code Online (Sandbox Code Playgroud) 对于喜欢命令max
选项na.rm
是默认设置FALSE
.我理解为什么这一般是一个好主意,但我想将它逆转一段时间 - 即在会议期间.
na.rm = TRUE
每当它是一个选项时,我怎么能要求R设置?我发现
options(na.action = na.omit)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我知道我可以na.rm=TRUE
为我写的每一个函数设置一个选项.
my.max <- function(x) {max(x, na.rm=TRUE)}
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的.我想知道是否有一些我可以在全球/普遍做的事情,而不是为每个功能做这件事.
file.choose()
运行后弹出的对话窗口有没有办法显示自定义标题,类似于X <- menu(files, graphics=TRUE, title="Choose file X")
?
现在我的代码需要加载几个文件.
X <- read.csv(file.choose())
Y <- read.csv(file.choose())
Z <- read.csv(file.choose())
Run Code Online (Sandbox Code Playgroud)
目前我只是使用我的(人类)内存来知道为第一个窗口,第二个窗口和第三个窗口选择哪些文件,但我希望窗口显示哪个对象X
Y
或Z
当前窗口的文件将被导入.我可以将窗口移到一边看看控制台的代码行,但这看起来非常不优雅.
我试过这个X <- read.csv(file.choose(new=c("Choose X")))
例子,但似乎没有做任何事情.
我试图计算人们使用Leada提供的数据集所采取的自行车频率.
这是代码:
library(dplyr)
setAs("character", "POSIXlt", function(from) strptime(from, format = "%m/%d/%y %H:%M"))
d <- read.csv("http://mandrillapp.com/track/click/30315607/s3-us-west-1.amazonaws.com?p=eyJzIjoiemxlVjNUREczQ2l5UFVPeEFCalNUdmlDYTgwIiwidiI6MSwicCI6IntcInVcIjozMDMxNTYwNyxcInZcIjoxLFwidXJsXCI6XCJodHRwczpcXFwvXFxcL3MzLXVzLXdlc3QtMS5hbWF6b25hd3MuY29tXFxcL2RhdGF5ZWFyXFxcL2Jpa2VfdHJpcF9kYXRhLmNzdlwiLFwiaWRcIjpcImEyODNiNjMzOWJkOTQxMGM5ZjlkYzE0MmQ0NDQ5YmU4XCIsXCJ1cmxfaWRzXCI6W1wiMTVlYzMzNWM1NDRlMTM1ZDI0YjAwODE4ZjI5YTdkMmFkZjU2NWQ2MVwiXX0ifQ",
colClasses = c("numeric", "numeric", "POSIXlt", "factor", "numeric", "POSIXlt", "factor", "numeric", "numeric", "factor", "character"),
stringsAsFactors = T)
names(d)[9] <- "BikeNo"
d <- tbl_df(d)
d <- d %>% mutate(Weekday = factor(weekdays(Start.Date)))
d %>% group_by(Weekday)
%>% summarise(Total = n())
%>% select(Weekday, Total)
Run Code Online (Sandbox Code Playgroud)
这很奇怪,但是dplyr不希望按工作日分组数据说:
错误:列'Start.Date'具有不受支持的类型
为什么它关心Start.Date列,我按哪个因素分组?您可以在本地运行代码以重现错误:它将自动下载数据.
PS我使用的是dplyr版本:dplyr_0.3.0.2
我想有条件地将两个数据表连接在一起:
library(data.table)
set.seed(1)
key.table <-
data.table(
out = (0:10)/10,
keyz = sort(runif(11))
)
large.tbl <-
data.table(
ab = rnorm(1e6),
cd = runif(1e6)
)
Run Code Online (Sandbox Code Playgroud)
根据以下规则:匹配的最小值out
在key.table
其keyz
值大于cd
.我有以下内容:
library(dplyr)
large.tbl %>%
rowwise %>%
mutate(out = min(key.table$out[key.table$keyz > cd]))
Run Code Online (Sandbox Code Playgroud)
它提供了正确的输出.我遇到的问题是,我实际使用的rowwise
操作似乎很昂贵,large.tbl
除非它在特定的计算机上,否则会崩溃.是否有更少的内存昂贵的操作?以下似乎稍微快一点,但对我遇到的问题还不够.
large.tbl %>%
group_by(cd) %>%
mutate(out = min(key.table$out[key.table$keyz > cd]))
Run Code Online (Sandbox Code Playgroud)
这有点像data.table
答案的问题,但答案不必使用该包.