2016-08-15 12 views
1

離散的なX軸値と多数のY値を持つデータセットがあります。私はまた、X軸の値の不確実性の尺度を持つ別のベクトルを持っています。この不確実性は、X軸を横切って変化する。私はX軸の値をこの不確定性指標に比例した量でジッタを加えたいと考えています。これはループでこれを行うのは簡単ですが扱いにくいです。私はこれに効率的なソリューションを探しています。条件に基づいた異なる金額によるジッタポイント

再現例:

#Create data frame with discrete X-axis values (a) 
dat <- data.frame(a = c(rep(5, 5), rep(15,5), rep(25,5)), 
        b = c(runif(5, 1, 2), runif(5, 2, 3), runif(5, 3, 4))) 

#Plot raw, unjittered data 
plot(dat$b ~ dat$a, data = dat, col = as.factor(dat$a), pch = 20, cex = 2) 

enter image description here

#vector of uncertainty estimates 
wid_vec <- c(1,10,3) 

#Ugly manual jittering, not feasible for large datasets but 
#produces the desired result 
dat$a_jit <- c(jitter(rep(5, 5), amount = 1), 
       jitter(rep(15, 5), amount = 10), 
       jitter(rep(25, 5), amount = 3)) 

plot(dat$b ~ dat$a_jit, col = as.factor(dat$a), pch = 20, cex = 2) 

enter image description here

#Ugly loop solution, also works 

newdat <- data.frame() 
a_s <- unique(dat$a) 

for (i in 1:length(a_s)){ 
    subdat  <- dat[dat$a == a_s[i],] 
    subdat$a_jit <- jitter(subdat$a, amount = wid_vec[i]) 
    newdat <- rbind(newdat, subdat) 
} 

plot(newdat$b ~ newdat$a_jit, col = as.factor(newdat$a), pch = 20, cex = 2) 

#Trying to make a vectorized solution, but this of course does not work. 

jitter_custom <- function(x, wid){ 
    j <- x + runif(length(x), -wid, wid) 
    j 
} 

#runif() does not work this way, this is shown to indicate the direction 
#I've been attempting 

基本的に、私はwid_vecベクトル内の該当するエントリを呼び出し、条件によってDATを分割する必要があり、 datエントリを変更して新しい列を作成しますwild_vecの値に基づいています。このためのエレガントなdplyrソリューションがあるはずですが、今は私を逃してしまったようです。

すべてのご意見をお待ちしております。

答えて

1

あなたは

set.seed(1) 
x <- with(dat, jitter(a, amount=setNames(c(1,10,3), unique(a))[as.character(a)])) 

を行うことができ

set.seed(1) 
dat$a_jit <- c(jitter(rep(5, 5), amount = 1), 
       jitter(rep(15, 5), amount = 10), 
       jitter(rep(25, 5), amount = 3)) 

する代わりに、結果は同じです。

identical(x, dat$a_jit) 
# [1] TRUE 

あなたは警告が消えるしたい場合、あなたはラップができsuppressWarnings()jitter(...)、またはwith(dat, mapply(jitter, x=a, amount=setNames(c(1,10,3), unique(a))[as.character(a)]))のようなものを使用してください。

関連する問題