我觉得我总是在问同一个问题的变种:(
我最近得到了一个使用do.call函数在grid.arrange上显示的图表+表格列表
library(grid)
library(ggplot2)
library(gridExtra)
g1 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=sin)
g2 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=tan)
g3 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=cos)
g4 <- tableGrob(data.frame(x <- 1:10, y<-2:11, z<-3:12))
plist <- list(g1,g2,g3,g4)
do.call("grid.arrange", c(plist))
Run Code Online (Sandbox Code Playgroud)
这有效,但我需要根据变量"numruns"生成"plist"我试过这个,但它不起作用:
plist2 <- list(paste0("g", seq_len(numruns+1)))
do.call("grid.arrange", c(plist2))
Run Code Online (Sandbox Code Playgroud)
我相信我正在做的是调用grid.arrange("g1","g2",...)而不是grid.arrange(g1,g2,...).我在使用lapply之前解决了类似的问题,但在这种情况下,这似乎对我没有帮助,否则我的使用不正确.
谢谢你的帮助.
示例数据:
player <- c("a", "b", "a", "b", "c",
"a", "a", "b", "c", "b",
"c", "a", "c", "c", "a")
is.winner <- c(TRUE, FALSE, TRUE, TRUE, TRUE,
FALSE, TRUE, TRUE, TRUE, FALSE,
TRUE, TRUE, TRUE, TRUE, FALSE)
df <- data.frame(player, is.winner)
Run Code Online (Sandbox Code Playgroud)
我的第一张图看起来像这样
ggplot(data=df, aes(x=player, y=as.numeric(is.winner))) +
geom_bar(stat="summary", fun.y=sum) +
coord_flip()
Run Code Online (Sandbox Code Playgroud)
我想要做的是将df $ player轴排序为"TRUE"值的总和,这样它看起来像这样:
我意识到我可以使用这样的东西:
df$player <- factor(df$player, levels=c("b", "a", "c"))
Run Code Online (Sandbox Code Playgroud)
但实际数据中有更多"玩家名字".另外我想要与胜利百分比等类似的事情.所以自动排序会很棒.以下获胜百分比的示例
df$is.winner <- factor(df$is.winner, levels=c("TRUE", "FALSE"))
df$player <- factor(df$player, levels=c("c", "b", "a"))
library(scales)
library(RColorBrewer)
ggplot(data=df, aes(x=player)) +
geom_bar(aes(fill=is.winner),position='fill')+
scale_y_continuous(labels=percent)+
scale_fill_brewer(palette="Set2") +
coord_flip()
Run Code Online (Sandbox Code Playgroud) 我相信这可能有一个简单的解决方案,但是我在描述我需要做的事情(以及要搜索的内容)时遇到了麻烦。我想我需要summarize功能。我的目标输出在最底部。
我正在尝试计算另一列中每个唯一值之间的值出现次数。这是一个df希望能说明我需要做的例子。
library(dplyr)
set.seed(1)
df <- tibble("name" = c(rep("dinah",2),rep("lucy",4),rep("sora",9)),
"meal" = c(rep(c("chicken","beef","fish"),5)),
"date" = seq(as.Date("1999/1/1"),as.Date("2000/1/1"),25),
"num.wins" = sample(0:30)[1:15])
Run Code Online (Sandbox Code Playgroud)
除其他事项外,我正在尝试总结(汇总)每个姓名使用此数据提供的餐食类型。
df
# A tibble: 15 x 4
name meal date num.wins
<chr> <chr> <date> <int>
1 dinah chicken 1999-01-01 8
2 dinah beef 1999-01-26 11
3 lucy fish 1999-02-20 16
4 lucy chicken 1999-03-17 25
5 lucy beef 1999-04-11 5
6 lucy fish 1999-05-06 23
7 sora chicken 1999-05-31 27
8 sora beef 1999-06-25 15
9 sora …Run Code Online (Sandbox Code Playgroud) 感觉我在这里犯了一个非常愚蠢的错误..因为我之前在另一个项目上做过这个(也许运气好吗?)
目标是通过使用函数在ggplot中构建几个图.我最终希望所有图表都显示在一个页面上,等等......
以下是一个有效的单个ggplot示例:
if (require("ggplot2") == FALSE) install.packages("ggplot2")
data_df = data.frame(matrix(rnorm(200), nrow=20))
time=1:nrow(data_df)
ggplot(data=data_df, aes(x=time, y=data_df[,1])) +
geom_point(alpha=1/4) +
ggtitle(deparse(substitute(data_df[1])))
Run Code Online (Sandbox Code Playgroud)
请注意,在此范围内将调用其他函数,这些函数将根据调用的dataframe列进行更改.我按照我做的另一个工作示例,但这只是给了我一个错误.我觉得我犯了一个基本错误,但不能指责它!
if (require("ggplot2") == FALSE) install.packages("ggplot2")
data_df = data.frame(matrix(rnorm(200), nrow=20))
time=1:nrow(data_df)
graphit <- function(sample_num){
ggplot(data=data_df, aes(x=time, y=data_df[,sample_num])) +
geom_point(alpha=1/4) +
ggtitle(deparse(substitute(data_df[sample_num])))
}
graphit(1)
#Error in `[.data.frame`(data_df, , sample_num) :
# object 'sample_num' not found
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
主要在stdev上遇到一些问题,可能还有一个最佳的解决方案。
dat <- data.frame(matrix(rnorm(16*100), ncol=100)) # data
Run Code Online (Sandbox Code Playgroud)
在此示例中,我有一个100列的数据集,我需要以25个样本为一组来获取每行的均值和标准差
我首先找到了可以单独执行此操作的代码
as.data.frame(rowMeans(dat[,1:25])) # mean of columns 1:25
as.data.frame(apply(dat[,1:25],1,mean)) # mean of columns 1:25
as.data.frame(apply(dat[,1:25],1,sd)) # sd of columns 1:25
Run Code Online (Sandbox Code Playgroud)
最初,我使用rowMeans并通过以下循环进行了这项工作:
dat.means <- list() # create empty list for means
# mean of every 25 cols
count <- 1
for(i in seq(1,length(dat),25)){
dat.means[[count]] <- cbind(rowMeans(as.data.frame(dat[,i:i+24])))
count=count+1
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,我找不到等效的rowMeans来计算标准差,因此回溯到尝试使用apply的过程。但是,我对如何以这种方式使用它的知识还很缺乏,而我在这一点上只是遇到了错误。
for(i in seq(1,length(dat),25)){
dat.means[[count]] <- cbind(apply(dat[,i:i+24],1,mean))
count=count+1
}
#Error in apply(dat[, i:i + 24], 1, mean) :
# dim(X) must have a positive length
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上述循环的其他一些迭代,但是仍然收到发布的错误。 …