学生问我是否可以使用R重新创建类似下面的图:
这是从 这篇论文....
这种东西不是我的专长,但使用下面的代码我能够创建95%CI省略号并用它们绘制geom_polygon().我使用rphylopic包装从图像库中抓取的图像填充图像.
#example data/ellipses
set.seed(101)
n <- 1000
x1 <- rnorm(n, mean=2)
y1 <- 1.75 + 0.4*x1 + rnorm(n)
df <- data.frame(x=x1, y=y1, group="A")
x2 <- rnorm(n, mean=8)
y2 <- 0.7*x2 + 2 + rnorm(n)
df <- rbind(df, data.frame(x=x2, y=y2, group="B"))
x3 <- rnorm(n, mean=6)
y3 <- x3 - 5 - rnorm(n)
df <- rbind(df, data.frame(x=x3, y=y3, group="C"))
#calculating ellipses
library(ellipse)
df_ell <- data.frame()
for(g in levels(df$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y),
scale=c(sd(x),sd(y)), …Run Code Online (Sandbox Code Playgroud) 我觉得这应该是显而易见的......我所要做的就是从图形底部删除x轴并将其添加到顶部.
这是一个可重复的例子.数据加代码来制作以下图表:
library(reshape2)
library(ggplot2)
data(mtcars)
dat <- with(mtcars, data.frame(mpg, cyl, disp, hp, wt, gear))
cor.matrix <- round(cor(dat, use = "pairwise.complete.obs", method = "spearman"), digits = 2)
diag(cor.matrix)<-NA
cor.dat <- melt(cor.matrix)
cor.dat <- data.frame(cor.dat)
cor.dat <- cor.dat[complete.cases(cor.dat),]
ggplot(cor.dat, aes(Var2, Var1, fill = value)) +
geom_tile(colour="gray90", size=1.5, stat="identity") +
geom_text(data=cor.dat, aes(Var2, Var1, label = value), color="black", size=rel(4.5)) +
scale_fill_gradient(low = "white", high = "dodgerblue", space = "Lab", na.value = "gray90", guide = "colourbar") +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, …Run Code Online (Sandbox Code Playgroud) 我试图找出如何使用dplyr和过滤大型数据集中的一些观察结果grepl.grepl如果其他解决方案更优化,我不会坚持.
拿这个样本df:
df1 <- data.frame(fruit=c("apple", "orange", "xapple", "xorange",
"applexx", "orangexx", "banxana", "appxxle"), group=c("A", "B") )
df1
# fruit group
#1 apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 applexx A
#6 orangexx B
#7 banxana A
#8 appxxle B
Run Code Online (Sandbox Code Playgroud)
我想要:
我已经设法弄清楚如何摆脱包含'x'或'xx'的所有东西,但不是以开头或结尾.这里是如何摆脱内部'xx'的一切(不仅仅是结束):
df1 %>% filter(!grepl("xx",fruit))
# fruit group
#1 apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 banxana A
Run Code Online (Sandbox Code Playgroud)
这显然是"错误的"(从我的角度来看)过滤了'appxxle'.
我从来没有完全掌握正则表达式.我一直在尝试修改代码,例如: grepl("^(?!x).*$", df1$fruit, perl = …
从这些问题- 从R数据帧的子集的行的随机样品 & 在数据帧样本随机行 我可以很容易地看到如何随机抽样(选择)"N"行从DF,或者"n"个来自特定级发起行df中的因子.
以下是一些示例数据:
df <- data.frame(matrix(rnorm(80), nrow=40))
df$color <- rep(c("blue", "red", "yellow", "pink"), each=10)
df[sample(nrow(df), 3), ] #samples 3 random rows from df, without replacement.
Run Code Online (Sandbox Code Playgroud)
例如,从"粉红色"颜色中抽取3个随机行 - 使用library(kimisc):
library(kimisc)
sample.rows(subset(df, color == "pink"), 3)
Run Code Online (Sandbox Code Playgroud)
或编写自定义功能:
sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE]
sample.df(subset(df, color == "pink"), 3)
Run Code Online (Sandbox Code Playgroud)
但是,我想从每个级别的因子中抽取3(或n)个随机行.即新的df将有12行(蓝色3个,红色3个,黄色3个,粉红色3个).显然可以多次运行,为每种颜色创建newdf,然后将它们绑定在一起,但我正在寻找一种更简单的解决方案.
我的问题的一个很好的例子可以在Shiny Gallery的Movie Review示例中找到:
http://shiny.rstudio.com/gallery/movie-explorer.html
左侧面板上有一个名为"Year Released"的滑块,范围介于1940年至2014年之间.以下是来自 ui.R
sliderInput("year", "Year released", 1940, 2014, value = c(1970, 2014))
您会注意到使用滑块时的年份格式如下:
"1,940" "2,014" 用逗号分隔第一个数字和最后三个数字.
我知道可以dateRangeInput在Shiny中使用,但这需要变量采用日期格式.对于简单数字的数据变量,例如这个例子,是否有一种简单的方法来格式化数字输出以删除逗号?我似乎无法弄清楚这一点,这似乎很简单.
我的数据帧的示例:
date
1 25 February 1987
2 20 August 1974
3 9 October 1984
4 18 August 1992
5 19 September 1995
6 16-Oct-63
7 30-Sep-65
8 22 Jan 2008
9 13-11-1961
10 18 August 1987
11 15-Sep-70
12 5 October 1994
13 5 December 1984
14 03/23/87
15 30 August 1988
16 26-10-1993
17 22 August 1989
18 13-Sep-97
Run Code Online (Sandbox Code Playgroud)
我有一个大型数据框,其日期变量有多种日期格式.变量中的大多数格式如上所示 - 还有一些非常罕见的其他格式.有多种格式的原因是数据是从各种网站中提取的,每个网站都使用不同的格式.
我尝试过使用简单的转换,例如
strftime(mydf$date,"%d/%m/%Y")
Run Code Online (Sandbox Code Playgroud)
但如果有多种格式,这些转换将无效.我不想求助于多个gsub类型的编辑.我想知道我是否错过了一个更简单的解决方案?
代码例如:
structure(list(date = structure(c(12L, 8L, 18L, 6L, 7L, 4L, 14L,
10L, 1L, 5L, 3L, …Run Code Online (Sandbox Code Playgroud) 我想在ggplot2图上添加多个阴影/矩形.在这个可重复的例子中,我只添加3,但我可能需要使用完整数据加起来一百.
这是我的原始数据的一个子集 - 在一个名为的数据框中temp- dput位于问题的底部:
Season tier group value
NA NA NA <NA> NA
99 1948 2 Wins 20
101 1948 2 Losses 17
NA.1 NA NA <NA> NA
NA.2 NA NA <NA> NA
104 1951 2 Wins 21
106 1951 2 Losses 18
107 1952 2 Wins 23
109 1952 2 Losses 18
110 1953 2 Wins 25
112 1953 2 Losses 18
113 1954 2 Wins 26
115 1954 2 Losses 19
116 1955 2 …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含8个字母的字符向量,每个字符出现两次:
x <- rep(LETTERS[1:8],2)
set.seed(1)
y <- sample(x)
y
# [1] "E" "F" "A" "D" "C" "B" "C" "G" "F" "A" "B" "G" "E" "H" "D" "H"
Run Code Online (Sandbox Code Playgroud)
我想找到每对字母之间的间隔.这里,interval是指两个相同字母之间的字母数.我可以像这样手动完成:
abs(diff(which(y=="A")))-1 #6
abs(diff(which(y=="D")))-1 #10
abs(diff(which(y=="H")))-1 #1
Run Code Online (Sandbox Code Playgroud)
我写了一个for循环来做这个...
res<-NULL
for(i in 1:8){ res[[i]] <- abs(diff(which(y==LETTERS[i])))-1 }
names(res)<-LETTERS[1:8]
res
# A B C D E F G H
# 6 4 1 10 11 6 3 1
Run Code Online (Sandbox Code Playgroud)
但是,我想在具有很长向量的随机化过程中使用这种方法.速度对此至关重要 - 我想知道是否有人有尽可能快速解决这个问题的好主意.
我有一个矢量:
seq1<-c('a','b','c','b','a','b','c','b','a','b','c')
Run Code Online (Sandbox Code Playgroud)
我希望置换此向量的元素以创建多个(理想情况下多达5000个)向量,条件是置换向量不能在连续元素中的向量内具有重复元素.例如,"abbca ...."是不允许的,因为'bb'是重复.
我意识到,对于这个小例子,可能没有5000个解决方案.我通常处理更大的向量.我也愿意考虑更换样品,但目前我正在研究无需更换的解决方案.
我正在寻找比我目前的想法更好的解决方案.
选项1. - 蛮力.
在这里,我只是重复采样并检查是否有任何连续的元素是重复的.
set.seed(18)
seq1b <- sample(seq1a)
seq1b
#[1] "b" "b" "a" "a" "c" "b" "b" "c" "a" "c" "b"
sum(seq1b[-length(seq1b)]==seq1b[-1]) #3
Run Code Online (Sandbox Code Playgroud)
这不是解决方案,因为有3个重复的连续元素.我也意识到这lag可能是检查重复元素的更好方法,但由于某种原因它很挑剔(我认为它被我加载的另一个包掩盖了).
set.seed(1000)
res<-NULL
for (i in 1:10000){res[[i]]<-sample(seq1a)}
res1 <- lapply(res, function(x) sum(x[-length(x)]==x[-1]))
sum(unlist(res1)==0) #228
Run Code Online (Sandbox Code Playgroud)
这在10000次迭代中产生228个选项.但是,让我们看看有多少独特的:
res2 <- res[which(unlist(res1)==0)]
unique(unlist(lapply(res2, paste0, collapse=""))) #134
Run Code Online (Sandbox Code Playgroud)
在10000次尝试中,我们只从这个简短的示例向量中获得134个唯一的.
以下是134个生成的示例序列中的3个:
# "bcbabcbabca" "cbabababcbc" "bcbcababacb"
Run Code Online (Sandbox Code Playgroud)
事实上,如果我尝试超过500,000个样本,我只能得到212个符合我的非重复标准的独特序列.这可能接近可能的上限.
选项2. - 迭代
我的第二个想法是对方法更加迭代.
seq1a
table(seq1a)
#a b c
#3 5 3
Run Code Online (Sandbox Code Playgroud)
我们可以将其中一个字母作为起点.然后从剩下的那些中取样另一个,检查它是否与先前选择的相同,如果没有,则将其添加到最后.等等等等...
set.seed(10)
newseq <- sample(seq1a,1) #b
newseq #[1] …Run Code Online (Sandbox Code Playgroud) 我做了一系列的事情dplyr,tidyr,所以想保持与管道解决方案,如果可能的.
我有一个列表,每个组件中的元素数量不均匀:
lolz <- list(a = c(2,4,5,2,3), b = c(3,3,2), c=c(1,1,2,4,5,3,3), d=c(1,2,3,1), e=c(5,4,2,2))
lolz
$a
[1] 2 4 5 2 3
$b
[1] 3 3 2
$c
[1] 1 1 2 4 5 3 3
$d
[1] 1 2 3 1
$e
[1] 5 4 2 2
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一个整齐的衬里用NAs填充每个元素,使得它们都与具有最大项目的元素具有相同的长度:
我有2个班轮:
lolz %>% lapply(length) %>% unlist %>% max -> mymax
lolz %>% lapply(function(x) c(x, rep(NA, mymax-length(x))))
$a
[1] 2 4 5 2 3 NA NA
$b
[1] 3 …Run Code Online (Sandbox Code Playgroud)