比你真正需要更多的代码,但要设置心情:
#Make some data and load packages
data<-data.frame(pchange=runif(80,0,1),group=factor(sample(c(1,2,3),80,replace=T)))
library(dplyr)
library(magrittr)
library(gridExtra)
library(ggplot2)
data%<>%arrange(group,pchange) %>% mutate(num=1:80)
#Make plot that includes unicode characters
g1<-ggplot(data, aes(factor(num),pchange, fill = group,width=.4)) +
geom_bar(stat="identity", position = "dodge") +
theme_classic()+
theme(axis.ticks = element_blank(),
axis.text.x = element_blank(),
legend.position="right")+
scale_y_continuous(breaks=c(0,.25,.5,.75,1))+
xlab("")+
scale_fill_discrete("Arbitrary Group",
breaks=c(1,2,3),
labels=c("< 1 Year", "\u2265 1 Year & \n\u2264 5 Years","> 5 Years"))
#I want to add an A below the plot (this may not be necessary for the issue, but its a part of the …Run Code Online (Sandbox Code Playgroud) 假设我们有这些数据:
dat<-data.frame(id=c(1,1,2,2,3,4,4,5,6,6),Rx=c(1,2,1,2,1,1,1,2,2,2))
id Rx
1 1 1
2 1 2
3 2 1
4 2 2
5 3 1
6 4 1
7 4 1
8 5 2
9 6 2
10 6 2
Run Code Online (Sandbox Code Playgroud)
其中Id是主题ID,Rx是他们收到的治疗.因此,有重复的观察结果,每个受试者的治疗可能也可能不一致.
我希望能够总结有多少受试者仅接收Rx 1,仅接收Rx 2,以及接收Rx 1和2多少受试者.
我宁愿一个dplyr解决方案,但data.table并base R会被罚款了.我想的是:
dat %>%
group_by(id,Rx) %>%
unique() %>%
...something
Run Code Online (Sandbox Code Playgroud)
最终结果应该是这样的:
Rx Count
1 2
2 2
Both 2
Run Code Online (Sandbox Code Playgroud)
谢谢!
数据:
df<-data.frame(grp=letters[1:4],perc=runif(4))
Run Code Online (Sandbox Code Playgroud)
第一个选项:
首先,为每个组创建包含零的第二个数据集
df2<-rbind(df,data.frame(grp=df[,1],perc=c(0,0,0,0)))
Run Code Online (Sandbox Code Playgroud)
然后用geom_points和绘图geom_line:
ggplot(df,aes(y=perc,x=grp))+
geom_point()+
geom_line(data=df2, aes(y=perc, x=grp))+
coord_flip()
Run Code Online (Sandbox Code Playgroud)

这看起来很好。创建第二个数据集的额外工作太多了。
另一个选项是使用 geom_bar 并使宽度变小:
ggplot(df,aes(y=perc,x=grp))+
geom_point()+
geom_bar(stat="identity",width=.01)+
coord_flip()
Run Code Online (Sandbox Code Playgroud)

但这也很奇怪,当我保存到 .pdf 时,并非所有的条都具有相同的宽度。
显然必须有一种更简单的方法来做到这一点,有什么建议吗?
我在这里有一个rstudio addin包.
其中一个插件允许用户定义目录,它会将位于包中的文件复制到该目录.
该文件位于:
atProjectManageAddins/inst/Docs/RMarkdownSkeleton.Rmd
Run Code Online (Sandbox Code Playgroud)
我试图将它复制到用户定义的目录,如下所示:
file.copy("inst/Docs/RMarkdownSkeleton.Rmd",
paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))
Run Code Online (Sandbox Code Playgroud)
我试图将它从包中的位置复制到用户定义的位置(基于两个单独的参数Dir和FolderName).
但这似乎不起作用.我的假设是我没有以正确的方式引用包目录.我试过了./Inst/,~/Inst/也许还有几个.我现在的假设是,有一个更系统的原因导致我无法file.copy()上班.
有什么建议?这甚至可能吗?
请注意,如果我通过source()和本地运行该功能runGadget(),它可以正常工作.只有在安装软件包并且我使用RStudio addins GUI引用它的软件包时,它才会失败.因此,我很确定我没有正确定义已安装.Rmd文件的文件路径.
编辑:我已经根据Carl的建议(在github上可以看到)更改为以下内容,但文件仍未被复制.
file.copy(system.file("Docs","Rmarkdownskeleton.rmd",package="atProjectManageAd??dins"),
paste0(Dir, FolderName, "/Reports/", FolderName, "_report.Rmd"))
Run Code Online (Sandbox Code Playgroud) 给定data.frame:
df <- data.frame(grp1 = c(1,1,1,2,2,2,3,3,3,4,4,4),
grp2 = c(1,2,3,3,4,5,6,7,8,6,9,10))
#> df
# grp1 grp2
#1 1 1
#2 1 2
#3 1 3
#4 2 3
#5 2 4
#6 2 5
#7 3 6
#8 3 7
#9 3 8
#10 4 6
#11 4 9
#12 4 10
Run Code Online (Sandbox Code Playgroud)
两个coluns都是分组变量,因此grp1已知列中的所有1 都被组合在一起,依此类推所有2,等等.然后同样如此grp2.众所周知,所有1都是相同的,所有2都是相同的.
因此,如果我们查看第3行和第4行,基于第1列,我们知道前3行可以组合在一起,后3行可以组合在一起.然后由于第3行和第4行共享相同的grp2值,我们知道所有6行实际上可以组合在一起.
根据相同的逻辑,我们可以看到最后六行也可以组合在一起(因为第7行和第10行共享相同的行grp2).
除了编写一组相当for()复杂的循环之外,还有更直接的方法吗?我还没有想过一个人.
我希望获得的最终输出看起来像:
# > df
# grp1 grp2 combinedGrp
# 1 1 1 1
# 2 …Run Code Online (Sandbox Code Playgroud) 我的工作流程中的一个主要工具是do.call(rbind, lapply())R中的示例:
df1 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
df2 <- data.frame(x1 = rnorm(10, 5), x2 = rnorm(10), x3 = rnorm(10))
getp <- function(var) {
return(t.test(df1[, var], df2[, var])$p.value)
}
list <- c('x1', 'x2', 'x3')
ps <- do.call(rbind, lapply(list, getp))
ps
[,1]
[1,] 6.232025e-09
[2,] 2.128019e-09
[3,] 5.824713e-08
Run Code Online (Sandbox Code Playgroud)
这会创建一个很好的p值列.在现实世界中,我会提取一行data.frame,每列都有有用的模型统计数据.目标是迭代具有相同模型类型的许多列并查看拟合/效果.
在python中,我可以创建一个类似的函数:
from statsmodels.stats.weightstats import ttest_ind
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'x1' : np.random.randn(10), 'x2' : np.random.randn(10), 'x3' : np.random.randn(10)})
df2 …Run Code Online (Sandbox Code Playgroud) df <- data.frame(a = c(1, 1, NA, 0, 1, 0),
b = c(0, 1, NA, NA, 0, 1),
c = c(NA, 0, NA, 0, 1, NA),
d = c(1, NA, NA, 1, 1, 0))
rowSums(df)
#[1] NA NA NA NA 3 NA
rowSums(df, na.rm=T)
#[1] 2 2 0 1 3 1
Run Code Online (Sandbox Code Playgroud)
我得到的第一个,但我的假设和希望是第三个观察结果会返回NA。有没有办法让它为第三次观察返回NA?