【发布时间】:2016-04-26 17:20:00
【问题描述】:
我有一些分组(按Tissue)的数字数据(value)。我想为每个组中多次出现的值添加一个小抖动。
输入:
df <- structure(list(value = c(1.05155243861439,
1.05155243861439, 1.05155243861439, 11.9769249796958, 1.05155243861439,
1.05155243861439, 1.05155243861439, 1.05155243861439, 1.05155243861439
), Tissue = structure(c(5L, 5L, 5L, 4L, 5L, 3L, 5L, 1L, 1L
), .Label = c("Brain", "Marrow", "Spleen", "Testes", "Vis"), class = "factor")), .Names = c("value",
"Tissue"), row.names = c("SM-2", "SM-3", "SM-4", "SM-5",
"SM-6", "SM-7", "SM-8", "SM-9", "SM-10"), class = "data.frame")
我尝试使用group_by 和mutate,但这会为每组的每个重复元素添加相同的抖动(有点毫无意义,对吧?)。
df <- df %>%
group_by(Tissue, value) %>%
mutate(jitter = ifelse(n()>1, value+runif(1, min=-0.15, max=0.15), value))
输出:
Source: local data frame [9 x 3]
Groups: Tissue, value [4]
value Tissue jitter
(dbl) (fctr) (dbl)
1 1.051552 Vis 1.1793382
2 1.051552 Vis 1.1793382
3 1.051552 Vis 1.1793382
4 11.976925 Testes 11.9769250
5 1.051552 Vis 1.1793382
6 1.051552 Spleen 1.0515524
7 1.051552 Vis 1.1793382
8 1.051552 Brain 0.9284923
9 1.051552 Brain 0.9284923
第 4 行和第 6 行正确无抖动。但是行[1-3,5,7] 我希望有独特的抖动。来自dplyr 更好的人的任何想法? :(
【问题讨论】:
-
代替
runif(1, ...)添加runif(n(), ...)。 -
@Gregor 仍然不应该工作,因为它们出于某种原因同时按
Tissue和value分组。尽管仅按Tissue分组时它不起作用,因为条件的长度为 1,因此,ifelse将始终返回长度为 1 的结果。ifelse通常很烂的众多原因之一。 -
我会保留最后一句:)
-
啊,当然。在那种情况下,我会推荐
jitter = value + runif(n(), min=-0.15, max=0.15) * (n() > 1) -
所以一般的经验法则,最好避免
ifelse?像公认答案这样的逻辑向量是更好的方法吗?