我有一个我要合并的许多data.frames的列表.这里的问题是每个data.frame在行数和列数方面都不同,但它们都共享关键变量(我已经调用过"var1","var2"在下面的代码中).如果data.frames在列方面是相同的,我只能rbind,plyr的rbind.fill可以完成这项工作,但这些数据并非如此.
因为该merge命令仅适用于2个data.frames,所以我转向Internet寻求创意.我从这里得到了这个,它在R 2.7.2中完美运行,这是我当时所拥有的:
merge.rec <- function(.list, ...){
if(length(.list)==1) return(.list[[1]])
Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}
Run Code Online (Sandbox Code Playgroud)
我会像这样调用函数:
df <- merge.rec(my.list, by.x = c("var1", "var2"),
by.y = c("var1", "var2"), all = T, suffixes=c("", ""))
Run Code Online (Sandbox Code Playgroud)
但是在2.7.2之后的任何R版本中,包括2.11和2.12,此代码失败并出现以下错误:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
(很明显,我在其他地方看到了其他对此错误的引用而没有解决方案).
有什么方法可以解决这个问题吗?
我有一个列表,看起来像这样:x[[state]][[year]].这个元素的每个元素都是一个数据框,单独访问它们不是问题.
但是,我想在多个列表中绑定数据帧.更具体地说,我想拥有与我多年一样多的数据帧输出,即每年所有状态数据帧的rbind.换句话说,我想将我所有的状态数据逐年合并到不同的数据框中.
我知道我可以将单个列表组合到一个数据框中do.call("rbind",list).但是我不知道如何在列表列表中这样做.
在ggplot2,如何引用带空格的变量名?
为什么在带引号的变量名上使用qplot()和ggplot()中断?
例如,这有效:
qplot(x,y,data=a)
Run Code Online (Sandbox Code Playgroud)
但这不是:
qplot("x","y",data=a)
Run Code Online (Sandbox Code Playgroud)
我问,因为我经常在名称中有空格的数据矩阵.例如,"国家收入".ggplot2需要数据帧; 好的,我可以转换.所以我想尝试类似的东西:
qplot("State Income","State Ideology",data=as.data.frame(a.matrix))
Run Code Online (Sandbox Code Playgroud)
那失败了.
而在基础R图形中,我会这样做:
plot(a.matrix[,"State Income"],a.matrix[,"State Ideology"])
Run Code Online (Sandbox Code Playgroud)
哪个会奏效.
有任何想法吗?
我终于开始进入Hadley Wickham令人印象深刻的ggplot2套餐,并且正在努力完成他的书.
在我的工作中,我经常使用文本标签显示散点图.这意味着一个plot()命令,然后是text().我曾经cex很快调整到我想要的字体大小.
我使用非常快速地创建了一个文本散点图qplot.但我无法快速调整大小.这是一个愚蠢的代码示例:
data(state)
qplot(Income,Population,data=as.data.frame(state.x77),geom=c("smooth","text"),method="lm",label=state.abb)
Run Code Online (Sandbox Code Playgroud)
在过去,我会这样做:
plot(xlim=range(Income),ylim=range(Population),data=state.x77,type="n")
text(Income,Population,state.abb,data=state.x77, cex=.5)
Run Code Online (Sandbox Code Playgroud)
如果我想的文本大小从我在默认看到减半(哦,我不得不这样做手工线性回归,并添加abline()来获得回归线 - 很高兴做这一切在通过GGPLOT2一个) .
我知道我可以添加尺寸调整大小,但它不是像我以前那样的相对大小调整.哈德利在推特上说我的尺寸是用毫米来衡量的,这对我来说并不完全直观.由于我经常调整绘图的大小,无论是在R还是在LaTeX中,绝对比例对我来说都没有用.
我必须遗漏一些非常简单的东西.它是什么?
哦 - 而且我知道我还没有真正使用过强大的ggplot2命令 - 只是想先把简单的东西放下来.
我有一个114行到16列的数据框,其中行是个体,列是他们的名字或NA.例如,前3行如下所示:
name name.1 name.2 name.3 name.4 name.5 name.6 name.7 name.8 name.9 name.10 name.11 name.12 name.13 name.14 name.15
1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Aanestad <NA> Aanestad <NA> Aanestad <NA>
2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Ackerman <NA> Ackerman <NA> Ackerman <NA> Ackerman <NA>
3 <NA> <NA> <NA> <NA> <NA> <NA> Alarcon <NA> Alarcon <NA> Alarcon <NA> Alarcon <NA> <NA> <NA>
Run Code Online (Sandbox Code Playgroud)
我想生成所有唯一名称的列表(如果每行有多个唯一名称)或向量(如果每行只有一个唯一名称),长度为114.
当我尝试时,apply(x,1,unique)我得到一个2xNcol数组,其中有时第一行单元格是NA,有时第二行单元格是NA.
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] …Run Code Online (Sandbox Code Playgroud) 我试图重复矢量a,b的元素次数.也就是说,如果y = 2,则a ="abc"应为"aabbcc".
为什么以下任何一个代码示例都不起作用?
sapply(a, function (x) rep(x,b))
Run Code Online (Sandbox Code Playgroud)
从plyr包装,
aaply(a, function (x) rep(x,b))
Run Code Online (Sandbox Code Playgroud)
我知道我错过了一些非常明显的东西......
使用Hadley的伟大的ggplot2和他的书(第78-79页),我能够轻松地生成单个等值区域图,使用如下代码:
states.df <- map_data("state")
states.df = subset(states.df,group!=8) # get rid of DC
states.df$st <- state.abb[match(states.df$region,tolower(state.name))] # attach state abbreviations
states.df$value = value[states.df$st]
p = qplot(long, lat, data = states.df, group = group, fill = value, geom = "polygon", xlab="", ylab="", main=main) + opts(axis.text.y=theme_blank(), axis.text.x=theme_blank(), axis.ticks = theme_blank()) + scale_fill_continuous (name)
p2 = p + geom_path(data=states.df, color = "white", alpha = 0.4, fill = NA) + coord_map(project="polyconic")
Run Code Online (Sandbox Code Playgroud)
其中"值"是我正在绘制的州级数据的向量.但是如果我想绘制多个地图,按一些变量(或两个)分组呢?
以下是安德鲁·格尔曼(Andrew Gelman)后来在纽约时报改编的关于美国各地卫生保健意见的情节的一个例子:

我希望能够效仿这个例子:根据两个变量(甚至一个变量)显示网格化的等值线图.所以我不传递值的向量,而是传递一个"long"的数据帧,每个状态有多个条目.
我知道ggplot2可以做到这一点,但我不确定如何.谢谢!
我有一个基于 Threadripper 1950X 的工作站,具有 16 个内核和 32 个线程以及大量内存。在 Windows 10 上运行 64 位 R 3.6.0(已修补),我经常使用 doParallel 库和 foreach 命令在 R 中运行并行代码,经常将其设置为使用 26-30 个线程。
最近,我检查了任务管理器。随着 doParallel 开始对所有进程进行后台处理,我对 CPU 使用率上升并不感到惊讶。但非常奇怪的是,Windows Defender(Microsoft 的防病毒默认设置)也开始假脱机,而且非常积极,使用率攀升至 70%(它被列为反恶意软件服务可执行文件)。这是我的意思的截图。当 R 代码完成时,Defender 会恢复到不重要的 CPU 使用率。
我对后卫的CPU使用率很高的在线阅读的帖子,但这似乎非常依赖于并行的R.我试图设置排除按照像帖子操作这个,但它并不能提高的问题。
当我运行具有大量线程集的并行代码时,我是否应该担心 Windows Defender 会不断挤出 R?
我试图了解如何在向量上使用优秀的plyr包的命令(在我的情况下,使用字符串).我想我想要使用aaply,但它失败了,要求保证金.但是我的矢量中没有列或行!
更具体一点,以下命令有效,但返回结果列表很奇怪.states.df是一个数据框,region是状态的名称(使用Hadley的map_data("state")命令返回).因此,states.df $ region是字符串的向量(特别是州名).opinion.new是一个数字向量,使用州名命名.
states.df <- map_data("state")
ch = sapply(states.df$region, function (x) { opinion.new[names(opinion.new)==x] } )
Run Code Online (Sandbox Code Playgroud)
我想做的是:
ch = aaply(states.df$region, function (x) { opinion.new[names(opinion.new)==x] } )
Run Code Online (Sandbox Code Playgroud)
其中ch是从opinion.new查找或拉出的数字向量.但aaply需要一个数组,并在向量上失败.
谢谢!