gpt4 book ai didi

r - dplyr:向组内的重复值添加抖动

转载 作者:行者123 更新时间:2023-12-02 17:28:06 24 4
gpt4 key购买 nike

我有一些分组的数字数据()(按Tissue)。我想为每个组中多次出现的值添加一个小的抖动。

输入:

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,但这会为每个组的每个重复元素添加相同的抖动(有点毫无意义,对吧?)。

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 的人有什么想法吗? :(

最佳答案

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

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

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:

jitter = value + if(n() > 1) {runif(n(), -.15, .15)} else 0

你喜欢哪个取决于你。

关于r - dplyr:向组内的重复值添加抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com