首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr:将抖动添加到组内的重复值

dplyr:将抖动添加到组内的重复值
EN

Stack Overflow用户
提问于 2016-04-26 17:20:00
回答 1查看 567关注 0票数 2

我有一些数字数据(value)被分组(按Tissue)。我想在每个组中多次发生的值中添加一个小抖动。

输入:

代码语言:javascript
复制
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_bymutate,但是这会给每个组的每个重复元素增加相同的抖动(有点毫无意义,对吧?)

代码语言:javascript
复制
df <- df %>%
    group_by(Tissue, value) %>%
    mutate(jitter = ifelse(n()>1, value+runif(1, min=-0.15, max=0.15), value))

输出:

代码语言:javascript
复制
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的想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 17:50:02

正如注释中指出的,ifelse()在这种情况下是有问题的,因为它返回的长度必须与测试的长度相同。由于您的测试长度为1,所以ifelse不会返回长度为n()的随机数。

我们可以通过将抖动的值乘以是否为n() > 1的逻辑来解决这一问题。如果为假,它将乘以0;如果为真,则乘以1。

代码语言:javascript
复制
df %>%
    group_by(Tissue, value) %>%
    mutate(
        jitter = value + runif(n(), min = -0.15, max = 0.15) * (n() > 1)
    )
#       value Tissue     jitter
#       (dbl) (fctr)      (dbl)
# 1  1.051552    Vis  1.1020925
# 2  1.051552    Vis  1.1398244
# 3  1.051552    Vis  0.9339355
# 4 11.976925 Testes 11.9769250
# 5  1.051552    Vis  1.1186657
# 6  1.051552 Spleen  1.0515524
# 7  1.051552    Vis  1.0249348
# 8  1.051552  Brain  1.0814222
# 9  1.051552  Brain  1.0496148

只有一个条件,您实际上可以使用普通的if(){} else,这也可以在mutate中使用。

代码语言:javascript
复制
jitter = value + if(n() > 1) {runif(n(), -.15, .15)} else 0

你喜欢的是你自己。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36871655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档