小编Jaa*_*aap的帖子

使用R中的data.tables的凸壳ggplot

我在这里找到了一个使用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中搜索此错误消息以获取建议.

merge r convex-hull ggplot2 data.table

9
推荐指数
1
解决办法
2158
查看次数

优雅的方式从数据框中删除稀有因子水平

我想按因子对数据帧进行子集化.我只想保留高于特定频率的因子水平.

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)

但是,存在更快更漂亮的解决方案吗?

r subset

9
推荐指数
3
解决办法
4424
查看次数

使用hjust替换geom_text位置

我正在绘制一个堆积条形图并用于geom_text插入每个堆栈的值.我面临的困难是一些堆栈非常小/窄,因此两个堆栈的文本相互重叠,因此不是很可读.我想以一种方式调整文本定位,例如文本位置在每个堆栈之间hjust == 1hjust == -1每个堆栈之间交替,以便不会有重叠(或任何其他方法将导致可读文本).

下面是目前我在做什么的例子(dputmydf提供如下):

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 = …

r ggplot2 geom-text

9
推荐指数
1
解决办法
9869
查看次数

更改颜色中间线ggplot geom_boxplot()

我想改变中线的颜色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)

r ggplot2

9
推荐指数
1
解决办法
4035
查看次数

dplyr:在group_by对象上计算mean(summarize_each)时处理NAs

我有一个数据框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)

r mean na dplyr

9
推荐指数
3
解决办法
8799
查看次数

创建具有200行且没有列的空数据框

我就是这样做的:

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 dataframe

9
推荐指数
2
解决办法
2万
查看次数

如果满足条件,如何对连续行进行子集化

我使用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)

r subset

9
推荐指数
2
解决办法
3513
查看次数

从整个数据框中删除一个字符

我有一个包含各种列的数据框,某些列中的某些数据包含双引号,我想删除它们,例如:

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)

r dataframe

9
推荐指数
1
解决办法
1万
查看次数

dplyr掩盖GGally并打破ggparcoord

给定一个新的会话,执行函数文档中提供的小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'

需要注意的是顺序库()语句也没有关系.

问题

  1. 代码示例有问题吗?
  2. 有没有办法克服这个问题(通过一些命名空间函数)?
  3. 或者这是一个错误?

我需要更大的分析中的dplyrggparcoord(.),但这个最小的例子反映了我面临的问题.

版本

  • R @ 3.2.3
  • dplyr @ 0.4.3
  • GGally @ 1.0.1
  • ggplot @ 2.0.0

UPDATE

将Joran给出的优秀答案包括起来:

答案

  1. 代码示例实际上是错误的,因为ggparcoord(.)期望data.frame不是钻石数据集给出的tbl_df(如果加载了dplyr).
  2. 问题是由强迫的解决tbl_df到 …

r ggplot2 dplyr parallel-coordinates ggally

9
推荐指数
1
解决办法
411
查看次数

在数据帧中查找前n行的总和

我想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前面的行?或者另一种方法呢?

r dataframe

9
推荐指数
1
解决办法
7513
查看次数