我在这里找到了一个使用ggplot和ddply绘制凸包形状的好例子:使用ggplot 绘制多个geom_point组周围的轮廓线
我以为我会尝试类似的东西 - 创建类似Ashby Diagram的东西 - 用data.table包练习:
test<-function()
{
library(data.table)
library(ggplot2)
set.seed(1)
Run Code Online (Sandbox Code Playgroud)
在这里我定义一个简单的表:
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
Run Code Online (Sandbox Code Playgroud)
然后我按级别定义船体位置:
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
Run Code Online (Sandbox Code Playgroud)
所以我的想法是将船体与dt合并,这样我最终可以操纵船体以获得ggplot的正确形式(如下所示):
ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_line()+
geom_polygon(data=hulls,aes(fill=level))
}
Run Code Online (Sandbox Code Playgroud)
但似乎我尝试合并外壳和dt的任何方式,我得到一个错误.例如,merge(hulls,dt)产生错误,如脚注1所示.
这似乎应该很简单,我确信我只是遗漏了一些明显的东西.任何关于类似帖子的方向或关于如何为ggplot准备船体的想法都非常感谢.或者如果您认为最好坚持采用ddply方法,请告诉我.
不需要的输出示例:
test<-function(){
library(data.table)
library(ggplot2)
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
set.seed(1)
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
setkey(dt, 'level') #setting the key seems unneeded
setkey(hulls, 'level')
hulls<-hulls[dt, allow.cartesian = TRUE]
ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_polygon(data=hulls,aes(fill=level))
}
Run Code Online (Sandbox Code Playgroud)
导致一堆乱七八糟的多边形:

脚注1:
vecseq中的错误(f __,len __,if(allow.cartesian)其他为as.integer(max(nrow(x),: Join结果为60行;超过15 = max(nrow(x),nrow(i))检查i中的重复键值,每个键值一遍又一遍地连接到x中的同一组.如果没关系,尝试包含
j并删除by(by-without-by),以便为每个组运行j以避免大如果您确定要继续,请使用allow.cartesian = TRUE重新运行.否则,请在FAQ,Wiki,Stack Overflow和datatable-help中搜索此错误消息以获取建议.
我想按因子对数据帧进行子集化.我只想保留高于特定频率的因子水平.
df <- data.frame(factor = c(rep("a",5),rep("b",5),rep("c",2)), variable = rnorm(12))
Run Code Online (Sandbox Code Playgroud)
此代码创建数据框:
factor variable
1 a -1.55902013
2 a 0.22355431
3 a -1.52195456
4 a -0.32842689
5 a 0.85650212
6 b 0.00962240
7 b -0.06621508
8 b -1.41347823
9 b 0.08969098
10 b 1.31565582
11 c -1.26141417
12 c -0.33364069
Run Code Online (Sandbox Code Playgroud)
而且我想降低重复次数少于5次的因子水平.我开发了一个for循环,它正在工作:
for (i in 1:length(levels(df$factor))){
if(table(df$factor)[i] < 5){
df.new <- df[df$factor != names(table(df$factor))[i],]
}
}
Run Code Online (Sandbox Code Playgroud)
但是,存在更快更漂亮的解决方案吗?
我正在绘制一个堆积条形图并用于geom_text插入每个堆栈的值.我面临的困难是一些堆栈非常小/窄,因此两个堆栈的文本相互重叠,因此不是很可读.我想以一种方式调整文本定位,例如文本位置在每个堆栈之间hjust == 1和hjust == -1每个堆栈之间交替,以便不会有重叠(或任何其他方法将导致可读文本).
下面是目前我在做什么的例子(dput中mydf提供如下):
library(ggplot2)
ggplot(mydf, aes(x=variable, y = value, fill = Category)) +
geom_bar(stat="identity") +
geom_text(aes(label = value, y = pos-(value/2)), size = 3)
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试的是:
使用position = position_dodge(width = 0.5)和position = position_jitter(h =0.5, w = 0.5),但没有造成什么,我要怎样做.
我的第一个想法是定义hjust = c(1,-1)希望它将被回收并且文本将在它们之间交替hjust == 1,hjust == -1但它会导致错误消息:
Error: Incompatible lengths for set aesthetics: size, hjust
Run Code Online (Sandbox Code Playgroud)
我也尝试过定义,size = c(3,3,3,3,3,3,3,3,3), hjust = …
我想改变中线的颜色geom_boxplot().我看了,找不到办法做到这一点.我在这里发布了我正在使用的R代码,但我真的需要一个如何改变颜色的参考.
ggplot(invitro2) +
geom_boxplot(aes(x = reorder(CANCER_TYPE,tmedian), y = GeoMedian_IC50)) +
xlab("") +
geom_point(aes(x = reorder(CANCER_TYPE,tmedian), y = GeoMedian_IC50)) +
theme_bw() +
scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
labels = trans_format("log10", math_format(10^.x))) +
annotation_logticks(sides="l") +
theme(axis.text.x=element_text(angle=45,size=10,hjust=1),
panel.grid.major = element_blank())
Run Code Online (Sandbox Code Playgroud) 我有一个数据框md:
md <- data.frame(x = c(3,5,4,5,3,5), y = c(5,5,5,4,4,1), z = c(1,3,4,3,5,5),
device1 = c("c","a","a","b","c","c"), device2 = c("B","A","A","A","B","B"))
md[2,3] <- NA
md[4,1] <- NA
md
Run Code Online (Sandbox Code Playgroud)
我想使用dplyr计算device1/device2组合的均值:
library(dplyr)
md %>% group_by(device1, device2) %>% summarise_each(funs(mean))
Run Code Online (Sandbox Code Playgroud)
但是,我得到了一些NAs.我希望忽略NA(na.rm = TRUE) - 我试过,但函数不想接受这个参数.这两行都会导致错误:
md %>% group_by(device1, device2) %>% summarise_each(funs(mean), na.rm = TRUE)
md %>% group_by(device1, device2) %>% summarise_each(funs(mean, na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud) 我就是这样做的:
df <- data.frame(a=1:200)
df$a <- NULL
df
Run Code Online (Sandbox Code Playgroud)
结果:
data frame with 0 columns and 200 rows
Run Code Online (Sandbox Code Playgroud)
只用一个命令就可以实现同样的目的吗?
我使用R来分析包含每日最高和最低温度值的时间序列(1951-2013).数据具有以下结构:
YEAR MONTH DAY MAX MIN
1985 1 1 22.8 9.4
1985 1 2 28.6 11.7
1985 1 3 24.7 12.2
1985 1 4 17.2 8.0
1985 1 5 17.9 7.6
1985 1 6 17.7 8.1
Run Code Online (Sandbox Code Playgroud)
我需要根据这个定义找出热浪的频率:连续三天或更多天的时间,每日最高和最低温度超过研究期间所有天的最高和最低温度的90%.
基本上,当Max和Min温度超过阈值时,我想要连续几天(三个或更多)的子集.输出将是这样的:
YEAR MONTH DAY MAX MIN
1989 7 18 45.0 23.5
1989 7 19 44.2 26.1
1989 7 20 44.7 24.4
1989 7 21 44.6 29.5
1989 7 24 44.4 31.6
1989 7 25 44.2 26.7
1989 7 26 44.5 25.0
1989 7 …Run Code Online (Sandbox Code Playgroud) 我有一个包含各种列的数据框,某些列中的某些数据包含双引号,我想删除它们,例如:
ID name value1 value2
"1 x a,"b,"c x"
"2 y d,"r" z"
Run Code Online (Sandbox Code Playgroud)
我希望这看起来像这样:
ID name value1 value2
1 x a,b,c x
2 y d,r z
Run Code Online (Sandbox Code Playgroud) 给定一个新的会话,执行函数文档中提供的小ggparcoord(.)示例
library(GGally)
data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))
Run Code Online (Sandbox Code Playgroud)
结果如下:
再次,从一个新的会话开始并使用加载的dplyr执行相同的脚本
library(GGally)
library(dplyr)
data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))
Run Code Online (Sandbox Code Playgroud)
结果是:
错误:(列表)对象无法强制输入'double'
需要注意的是顺序库()语句也没有关系.
问题
我需要更大的分析中的dplyr和ggparcoord(.),但这个最小的例子反映了我面临的问题.
版本
UPDATE
将Joran给出的优秀答案包括起来:
答案
我想n在数据帧中找到前一行的总和.例如:
id = 1:10
vals = c(4,7,2,9,7,0,4,6,1,8)
test = data.frame(id,vals)
Run Code Online (Sandbox Code Playgroud)
因此,n=3我想将下一列计算为:
test$sum = c(NA, NA, 13,18,18,16,11,10,11,15)
Run Code Online (Sandbox Code Playgroud)
我最接近的是使用以下方法创建一个新列:
test$valprevious = c(NA, head(test$vals,-1)
Run Code Online (Sandbox Code Playgroud)
然后使用循环重复此次n,然后sum跨列.我确定这不是最有效的方法,是否有任何函数可以访问n前面的行?或者另一种方法呢?