创建包含quantile()函数输出的列。

3
我正在寻找一种基于quantile()函数输出创建多列的方法。实际上,我想要包含女性和男性值的每行的分位数。
第1行的示例: 我想要quantile(c(4.6, 5.8)) 它会给出:
  0%  25%  50%  75% 100% 
 4.6  4.9  5.2  5.5  5.8 

这里是一个数据样本和我想要的输出:
数据:
  code  womens  mens
1: 01    4.6    5.8
2: 02    5.0    4.6
3: 03    4.1    5.3
4: 04    5.2    3.0
5: 05    4.6    5.4
6: 06    2.3    3.4

what I want :

  code  womens  mens  0%  25%  50%  75% 100%
1: 01    4.6    5.8  4.6  4.9  5.2  5.5  5.8 
2: 02    5.0    4.6  4.6  4.7  4.8  4.9  5.0   
3: 03    4.1    5.3  4.1  4.4  4.7  5.0  5.3
4: 04    5.2    3.0  3.0  3.5  4.1  4.6  5.2 
5: 05    4.6    5.4  4.6  4.8  5.0  5.2  5.4 
6: 06    2.3    3.4  2.3  2.6  2.8  3.1  3.4

我已经尝试使用lapply()和一些for loop但没有结果。对于每行数据,我的结果始终相同,为4.6 4.9 5.2 5.5 5.8

感谢大家的帮助。

2个回答

3
cbind(d, do.call(rbind, lapply(1:NROW(d), function(i){
    quantile(d[i, c("womens", "mens")])
})))
#   code womens mens  0%   25%  50%   75% 100%
#1:    1    4.6  5.8 4.6 4.900 5.20 5.500  5.8
#2:    2    5.0  4.6 4.6 4.700 4.80 4.900  5.0
#3:    3    4.1  5.3 4.1 4.400 4.70 5.000  5.3
#4:    4    5.2  3.0 3.0 3.550 4.10 4.650  5.2
#5:    5    4.6  5.4 4.6 4.800 5.00 5.200  5.4
#6:    6    2.3  3.4 2.3 2.575 2.85 3.125  3.4

数据

d = structure(list(code = 1:6,
                   womens = c(4.6, 5, 4.1, 5.2, 4.6, 2.3),
                   mens = c(5.8, 4.6, 5.3, 3, 5.4, 3.4)),
              class = "data.frame",
              row.names = c("1:", "2:", "3:", "4:", "5:", "6:"))

2

如果它是一个data.table,那么在base R中的一个选项是将其转换为data.framesetDF),然后使用applyMARGIN = 1)循环遍历行,获取quantile并分配新列

library(data.table)
setDF(df1)
df1[c("0%", "25%", "50%", "75%", "100%")] <- t(apply(df1[, 2:3], 1, 
           quantile, na.rm = TRUE))

数据

df1 <- structure(list(code = 1:6, womens = c(4.6, 5, 4.1, 5.2, 4.6, 
2.3), mens = c(5.8, 4.6, 5.3, 3, 5.4, 3.4)), class = c("data.table", 
"data.frame"), row.names = c(NA, -6L))

1
@Tedel 你有一个 data.table 吗?如果是这样,在子集中使用 with = FALSE - akrun
1
@akrun 非常感谢您的回答,它很有效!您是最棒的,总是提供最好的答案,再次感谢!当堆栈允许时,我会接受这个答案。 - Tedel
@akrun 最后一个问题,为什么结果不同呢?如果我执行“quantile(c(4.6, 5.8))”,我会得到:4.6 4.9 5.2 5.5 5.8,但是使用完整函数时,第一行是:4.6 4.9 4.7 4.3 4.8。 - Tedel
@Tedel 当我尝试使用t(apply(df1[, 2:3], 1, quantile, na.rm = TRUE))时,输出结果为: 0% 25% 50% 75% 100% [1,] 4.6 4.900 5.20 5.500 5.8 这是否可能是因为您先将对象作为数据框尝试,然后更改了一些值? - akrun
2
@Tedel 忘记了 transpose,即 t。已修复。 - akrun
显示剩余6条评论

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