R中因子的级别和标签之间似乎存在差异.到目前为止,我一直认为级别是因子级别的"真实"名称,标签是用于输出的名称(例如表格和图表) .显然,情况并非如此,如下例所示:
df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame': 3 obs. of 2 variables:
$ v: num 1 2 3
$ f: Factor w/ 3 levels "a","b","c": 1 2 3
df$f <- factor(df$f, levels=c('a','b','c'),
labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"
Run Code Online (Sandbox Code Playgroud)
我认为在脚本编写时仍可以以某种方式访问级别('a','b','c'),但这不起作用:
> df$f=='a'
[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
但这样做:
> df$f=='Treatment A: XYZ'
[1] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
所以,我的问题包括两部分:
关卡和标签有什么区别?
脚本和输出的因子级别是否可以有不同的名称?
背景:对于较长的脚本,使用较短因子级别的脚本似乎要容易得多.但是,对于报告和图表,这个较短的因子水平可能不够,应该用精简者名称替换.
我想创建一个ggplot
基于的新主题theme_bw()
.
我想以下步骤是必要的(在伪代码中):
theme_new() <- theme_bw()
theme_update(axis.title.x = theme_text(family = base_family, size = base_size, vjust = 0.5))
任何关于如何实现这一点的建议将非常感谢!
编辑: @Andrie,我根据自己的需要修改了你的答案:
theme_new <- theme_set(theme_bw())
theme_new <- theme_update(axis.title.x = theme_text(family = base_family, size = base_size, vjust = 0.5))
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
ggplot(mtcars, aes(factor(cyl))) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
匹配错误(gparname,names(gpars)):找不到对象'base_size'
编辑: 2017年10月31日,由@Andrie提供的答案工作得很好. R版本3.4.1,ggplot2_2.2.1
我使用R遇到了一个小问题......
在以下数据框中
test <- data.frame(v1=c(rep(1,3),rep(2,3)),v2=0)
Run Code Online (Sandbox Code Playgroud)
我想在v1为1的行中更改v2的值.
test[test$v1==1,"v2"] <- 10
Run Code Online (Sandbox Code Playgroud)
工作得很好.
test
v1 v2
1 1 10
2 1 10
3 1 10
4 2 0
5 2 0
6 2 0
Run Code Online (Sandbox Code Playgroud)
但是,我需要在函数中执行此操作.
test <- data.frame(v1=c(rep(1,3),rep(2,3)),v2=0)
test.fun <- function (x) {
test[test$v1==x,"v2"] <- 10
print(test)
}
Run Code Online (Sandbox Code Playgroud)
调用该函数似乎有效.
test.fun(1)
v1 v2
1 1 10
2 1 10
3 1 10
4 2 0
5 2 0
6 2 0
Run Code Online (Sandbox Code Playgroud)
但是,当我现在看看测试时:
test
v1 v2
1 1 0
2 1 0
3 1 0 …
Run Code Online (Sandbox Code Playgroud) 我遇到了一些困扰我的问题...希望这里的任何人都可以帮助我.
我得到了以下数据框
f <- c('a','a','b','b','b','c','d','d','d','d')
v1 <- c(1.3,10,2,10,10,1.1,10,3.1,10,10)
v2 <- c(1:10)
df <- data.frame(f,v1,v2)
Run Code Online (Sandbox Code Playgroud)
f是一个因素; v1和v2是值.对于f的每个级别,我只想要保留一行:在此因子级别中具有最低值v1的行.
f v1 v2
a 1.3 1
b 2 3
c 1.1 6
d 3.1 8
Run Code Online (Sandbox Code Playgroud)
我用聚合,ddply,by,tapply尝试了各种各样的东西......但似乎没有任何效果.对于任何建议,我将非常感激.
很抱歉没有包含我的问题的任何示例数据.我找不到轻松生成示例形状文件的方法.希望有经验的用户ggplot
可以从下面的描述中看到我想做的事情.
我有:
一个data.frame
X与约样地信息(plotid
,var1
,var2
,var3
,var4
,...)
Y
具有样本图的空间信息的多边形shapefile
导入shapefile Y
(with maptools
)和fortify
ing as data.frame
Z
(ggplot2
)可以正常工作.melt
荷兰国际集团X
以X_melted
作品同样精致.merge
-ing Z
并X_melted
以mapdf
作品为好.
这意味着,现在我们有一个data.frame
长形式的空间信息和var1
,var2
,var3
,...
现在我想绘制这样的数据框:
pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1
Run Code Online (Sandbox Code Playgroud)
结果是一个很好的情节,每个变量有一个面板.面板的地图是相同的,但填充颜色随变量的值而变化.到目前为止,一切都像魅力......有一个问题: …
我们将树的直径作为预测因子,树高作为因变量.对于这种数据存在许多不同的方程式,我们尝试对其中的一些进行建模并比较结果.
但是,我们无法弄清楚如何正确地将一个方程式放入相应的R
formula
格式中.
该trees
数据组中R
,可以使用,例如,
data(trees)
df <- trees
df$h <- df$Height * 0.3048 #transform to metric system
df$dbh <- (trees$Girth * 0.3048) / pi #transform tree girth to diameter
Run Code Online (Sandbox Code Playgroud)
首先,似乎运作良好的等式的例子:
form1 <- h ~ I(dbh ^ -1) + I( dbh ^ 2)
m1 <- lm(form1, data = df)
m1
Call:
lm(formula = form1, data = df)
Coefficients:
(Intercept) I(dbh^-1) I(dbh^2)
27.1147 -5.0553 0.1124
Run Code Online (Sandbox Code Playgroud)
系数a
,b
并c
估计,这是我们感兴趣的.
现在有问题的等式:
试着像这样适合它:
form2 <- …
Run Code Online (Sandbox Code Playgroud) 我不久前开始使用Sweave.但是,像大多数人一样,我很快遇到一个主要问题:速度.扫描大型文档需要很长时间才能运行,这使得高效工作非常具有挑战性.使用cacheSweave可以加速数据处理.但是,情节 - 特别是ggplot;) - 渲染时间仍然太长.这是我想要使用pgfSweave的方式.
经过许多小时,我终于成功地用Eclipse/StatET/Texlipse建立了一个工作系统.然后,我想将现有的报告转换为与pgfSweave一起使用,并且有一个惊喜:我的大多数ggplots似乎都不再起作用了.以下示例在控制台和Sweave中完美运行:
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
Run Code Online (Sandbox Code Playgroud)
然而,使用pgfSweave运行它,我收到此错误:
Error in if (width > 0) { : missing value where TRUE/FALSE needed
In addition: Warning message:
In if (width > 0) { :
the condition has length > 1 and only the first element will be used
Error in driver$runcode(drobj, chunk, chunkopts) :
Error in if (width > 0) { : missing value where TRUE/FALSE needed
Run Code Online (Sandbox Code Playgroud)
当我从geom_point中删除aes(...)时,该图与pgfSweave完美配合.
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl …
Run Code Online (Sandbox Code Playgroud)