如何为每个条件添加中位数和标准差。

3

我的数据看起来是这样的

df<-structure(list(Data = c("P718", "Trans17", "Ham8Y"), Rep1_Condition = c(30100000, 
1.11e+10, 2.05e+09), Rep2_Condition = c(37700000, 1.3e+10, 3.52e+09
), Rep3_Condition = c(4.27e+10, 0, 1.75e+10), Rep1_H1 = c(4.49e+08, 
1.28e+11, 5.5e+10), Rep2_H1 = c(4.31e+08, 1.5e+11, 6.38e+10), 
    Rep3_H1 = c(3.89e+10, 0, 1.89e+10), Rep1_H2 = c(4.07e+08, 
    1.24e+11, 4.41e+10), Rep2_H2 = c(1.98e+08, 8.21e+10, 3.14e+10
    ), Rep3_H2 = c(1.75e+10, 0, 1.46e+09)), class = "data.frame", row.names = c(NA, 
-3L))

我想为每个3次复制品添加中位数和标准偏差,例如:

P718  3.01e+07  3.77e+07  4.27e+10

值可以在其旁边。

类似这样的结构。

out<- structure(list(Data = c("P718", "Trans17", "Ham8Y"), Rep1_Condition = c(30100000, 
1.11e+10, 2.05e+09), Rep2_Condition = c(37700000, 1.3e+10, 3.52e+09
), Rep3_Condition = c(4.27e+10, 0, 1.75e+10), Condition_median = c(NA, 
NA, NA), Condition_SD = c(NA, NA, NA), Rep1_H1 = c(4.49e+08, 
1.28e+11, 5.5e+10), Rep2_H1 = c(4.31e+08, 1.5e+11, 6.38e+10), 
    Rep3_H1 = c(3.89e+10, 0, 1.89e+10), H1_Median = c(NA, NA, 
    NA), H1_SD = c(NA, NA, NA), Rep1_H2 = c(4.07e+08, 1.24e+11, 
    4.41e+10), Rep2_H2 = c(1.98e+08, 8.21e+10, 3.14e+10), Rep3_H2 = c(1.75e+10, 
    0, 1.46e+09), H2_Median = c(NA, NA, NA), H2_SD = c(NA, NA, 
    NA)), class = "data.frame", row.names = c(NA, -3L))

你需要新的列吗,例如 df %>% pivot_longer(cols = -Data, names_to = c("grp", ".value"), names_sep = "_") %>% group_by(Data) %>% mutate(across(where(is.numeric), list(median= ~ median(.x), SD = ~ sd(.x)))) - akrun
@akrun 我刚刚发布了一个输出示例的例子。 - nik
我的解决方案是以长格式获取标准差和中位数,这可能对您的绘图有用。如果您想要宽格式,则可以使用以下代码:df %>% pivot_longer(cols = -Data, names_to = c("grp", ".value"), names_sep = "_") %>% group_by(Data) %>% mutate(across(where(is.numeric), list(median= ~ median(.x), SD = ~ sd(.x)))) %>% pivot_wider(names_from = grp, values_from = Condition:H2_SD) - akrun
抱歉,在 pivot_wider 中,我选择了所有列 df %>% pivot_longer(cols = -Data, names_to = c("grp", ".value"), names_sep = "_") %>% group_by(Data) %>% mutate(across(where(is.numeric), list(median= ~ median(.x), SD = ~ sd(.x)))) %>% pivot_wider(names_from = grp, values_from = Condition:H2) - akrun
那就是它所做的,请检查输出中的值。 - akrun
显示剩余5条评论
1个回答

2

一种选项是使用 pivot_longer 转换为“长”格式,不包括“Data”列,然后按“Data”分组,通过对numeric列进行 mutate 操作来创建两个附加列 medianSD(由于有多个列,因此在应用函数时会返回后缀名称作为named列表),最后使用 pivot_wider 还原为“宽”格式。

library(dplyr)
library(tidyr)
out2 <- df %>% 
   pivot_longer(cols = -Data, names_to = c("grp", ".value"), 
     names_sep = "_") %>% 
   group_by(Data) %>%
   mutate(across(where(is.numeric), 
     list(median= ~ median(.x), SD = ~ sd(.x)))) %>% 
   ungroup %>%
   pivot_wider(names_from = grp, values_from = Condition:H2)

-检查

> out2$Condition_median
[1] 3.77e+07 1.11e+10 3.52e+09
> matrixStats::rowMedians(as.matrix(df[2:4]))
[1] 3.77e+07 1.11e+10 3.52e+09

-输出

> out2
# A tibble: 3 × 16
  Data    Condition_median Condition_SD    H1_median     H1_SD H2_median   H2_SD Condition_Rep1 Condition_Rep2 Condition_Rep3 H1_Rep1 H1_Rep2 H1_Rep3
  <chr>              <dbl>        <dbl>        <dbl>     <dbl>     <dbl>   <dbl>          <dbl>          <dbl>          <dbl>   <dbl>   <dbl>   <dbl>
1 P718            37700000 24633284613.    449000000   2.22e10   4.07e 8 9.93e 9       30100000       37700000    42700000000 4.49e 8 4.31e 8 3.89e10
2 Trans17      11100000000  7021633238. 128000000000   8.10e10   8.21e10 6.31e10    11100000000    13000000000              0 1.28e11 1.5 e11 0      
3 Ham8Y         3520000000  8527443931.  55000000000   2.38e10   3.14e10 2.19e10     2050000000     3520000000    17500000000 5.5 e10 6.38e10 1.89e10
# … with 3 more variables: H2_Rep1 <dbl>, H2_Rep2 <dbl>, H2_Rep3 <dbl>

NULL Warning message: Unknown or uninitialised column: Condition_median. - nik
@nik 我使用的是 1.0.8 版本的 dplyr,如果有区别的话。 - akrun
@nik 这是我得到的结果 > names(out2) [1] "数据" "条件中位数" "条件标准差" "H1中位数" "H1标准差" "H2中位数" "H2标准差" [8] "条件重复1" "条件重复2" "条件重复3" "H1重复1" "H1重复2" "H1重复3" "H2重复1" [15] "H2重复2" "H2重复3" - akrun
@> names(out2) [1] "数据" "条件_重复1" "条件_重复2" "条件_重复3" "H1_重复1"
[6] "H1_重复2" "H1_重复3" "H2_重复1" "H2_重复2" "H2_重复3"
- nik
@nik,我使用您的数据尝试了多次,但输出结果都一样。 - akrun
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接