我的代码基于this example on stackoverflow。我的第一次尝试工作正常,如下所示:
然后我尝试用三组做同样的事情。我这样分组:
df.m <- transform(df.m, facet=ifelse(df.m$variable %in% c(var11, var12), 'One',
ifelse(df.m$variable %in% c(var21, var22), 'Two', 'Three')))
g <- ggplot(df.m, aes(group=facet, x=Years, y=value, colour=variable, shape=variable))
g <- g + geom_point() + facet_wrap(~facet)
使用这段代码,我最终会得到一个包含所有变量的图。没有分面发生。我认为我对ifelse
做错了,但我不确定。
根据要求,这是head(df.m)
:
Years variable value facet
1 1997 var11 0.1245161 One
2 1998 var11 0.1154599 One
3 1999 var11 0.1151908 One
4 2000 var11 0.1209199 One
5 2001 var11 0.1321990 One
6 2002 var11 0.1476364 One
答案 0 :(得分:3)
所以,问题是因为你错过了与%in%
进行比较的向量中的引号。但是你得到错误消息的原因比这复杂一点。您的工作区中必须有名为var11
,var12
等的对象
从干净的工作空间开始:
require(reshape2)
dat = data.frame(ID = rnorm(10), var11 = rnorm(10),
var12 = rnorm(10), var21 = rnorm(10), var22 = rnorm(10),
var13 = rnorm(10), var23 = rnorm(10))
df.m = melt(dat, id.vars = 1)
如果我这样做,我在运行transform时会收到一条错误消息:
dfm2 = transform(df.m, facet=ifelse(variable %in% c(var11, var12), 'One',
ifelse(variable %in% c(var21, var22), 'Two', 'Three')))
Error in match(x, table, nomatch = 0L) : object 'var11' not found
现在我在工作区中创建了一些具有相同名称的矢量对象:
var11 = 1
var12 = 2
var21 = 1
var22 = 2
var13 = 1
dfm2 = transform(df.m, facet=ifelse(variable %in% c(var11, var12), 'One',
ifelse(variable %in% c(var21, var22), 'Two', 'Three')))
Wah-lah,没有错误消息和facet
变量的一个级别而不是三个。从本质上讲,您从未进行过任何匹配,因此最后一级(Three
)被分配给所有内容。
您需要这些引号来引用字符向量而不是对象。
transform(df.m, facet=ifelse(variable %in% c("var11", "var12"), 'One',
ifelse(variable %in% c("var21", "var22"), 'Two', 'Three')))