我的数据如下:
<表类=“s-表”>
<标题>
id
类型
值
标题>
<正文>
x1
A
1
x1
A
2
x1
A
3
x1
B
2
x1
B
4
x1
B
6
x1
C
1
x1
C
3
x1
C
5
表>
我想从上面的数据中总结出两列
- 每种类型的值的中位数以及
- 所有类型(但各自类型)的值的中位数。即,对于类型 A,计算类型 B 和 C 的值的中位数。
喜欢:
<表类=“s-表”>
<标题>
id
类型
median_type_value
median_non_type_value
标题>
<正文>
x1
A
2
3.5
x1
B
4
2.5
x1
C
3
2.5
表>
我能够计算中位数类型值,但不能计算另一个。
示例数据/代码:
library(tidyverse)
df = data.frame(id=c(rep("x1",9)), type=c(rep("A",3),rep("B",3),rep("C",3)), value=c(1,2,3,2,4,6,1,3,5))
df %>%
group_by(id,type) %>%
summarise(median_type_value=median(value))
如果能得到一些指导或解决方案就太好了。谢谢!
最佳答案
尝试
library(dplyr)# version >= 1.1.0
df %>%
reframe(median_type_value = median(value),
median_non_type_value =
median(df$value[df$type !=cur_group()$type]), .by = c(id, type))
-输出
id type median_type_value median_non_type_value
1 x1 A 2 3.5
2 x1 B 4 2.5
3 x1 C 3 2.5
或者使用以前版本的dplyr
df %>%
group_by(id, type) %>%
summarise(median_type_value = median(value),
median_non_type_value = median(df$value[df$type
!=cur_group()$type]), .groups = 'drop')
-输出
# A tibble: 3 × 4
id type median_type_value median_non_type_value
<chr> <chr> <dbl> <dbl>
1 x1 A 2 3.5
2 x1 B 4 2.5
3 x1 C 3 2.5
或者使用data.table
library(data.table)
setDT(df)[,
{
tmp <- .SD
tmp[,.(median_type_value = median(value),
median_non_type_value = median(tmp$value[tmp$type != .BY])),
type]
}, id]
-输出
id type median_type_value median_non_type_value
1: x1 A 2 3.5
2: x1 B 4 2.5
3: x1 C 3 2.5
关于r - 有没有一种简洁的方法来忽略几行并使用汇总函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75606759/