R中分组变量的十进制数

R中分组变量的十进制数,r,data.table,dplyr,lapply,purrr,R,Data.table,Dplyr,Lapply,Purrr,我想找出每个分组变量的小数点。我特别寻找使用dplyr和lappy的方法。如果你能帮我,我将不胜感激 这是我的,我试过了。除了调用dplyr::ntile()(这对我不起作用)之外,我不知道如何直接提取小数点 尝试1 以下是我在Hmisc软件包中尝试使用的descripe(): set.seed(10) IData <- data.frame(let = sample( x = LETTERS, size = 10000, replace=TRUE), numbers = sample(x

我想找出每个分组变量的小数点。我特别寻找使用
dplyr
lappy
的方法。如果你能帮我,我将不胜感激

这是我的,我试过了。除了调用
dplyr::ntile()
(这对我不起作用)之外,我不知道如何直接提取小数点

尝试1

以下是我在
Hmisc
软件包中尝试使用的
descripe()

set.seed(10)
IData <- data.frame(let = sample( x = LETTERS, size = 10000, replace=TRUE), numbers = sample(x = c(1:20000),size = 10000))

Output<-IData %>% data.table::as.data.table(.) %>% split(.,by=c("let"),drop = TRUE,sorted = TRUE) %>% purrr::map(~describe(.$numbers))
尝试3=预期输出

最后,我尝试使用老方法(即复制粘贴)以获得预期的输出:

Output<-IData %>%
  dplyr::group_by(let) %>%
  dplyr::summarise( QQuantile1 = quantile(`numbers`, c(.10)),
                    QQuantile1 = quantile(`numbers`, c(.10)),
                    QQuantile2 = quantile(`numbers`, c(.20)),
                    QQuantile3 = quantile(`numbers`, c(.30)),
                    QQuantile4 = quantile(`numbers`, c(.40)),
                    QQuantile5 = quantile(`numbers`, c(.50)),
                    QQuantile6 = quantile(`numbers`, c(.60)),
                    QQuantile7 = quantile(`numbers`, c(.70)),
                    QQuantile8 = quantile(`numbers`, c(.80)),
                    QQuantile9 = quantile(`numbers`, c(.90)),
                    QQuantile10 = quantile(`numbers`, c(.100)))
输出%
dplyr::分组依据(let)%>%
dplyr::summary(QQuantile1=分位数(`numbers`,c(.10)),
QQuantile1=分位数(`numbers`,c(.10)),
QQuantile2=分位数(`numbers`,c(.20)),
QQuantile3=分位数(`numbers`,c(.30)),
QQuantile4=分位数(`numbers`,c(.40)),
QQuantile5=分位数(`numbers`,c(.50)),
QQuantile6=分位数(`numbers`,c(.60)),
QQuantile7=分位数(`numbers`,c(.70)),
QQuantile8=分位数(`numbers`,c(.80)),
QQuantile9=分位数(`numbers`,c(.90)),
QQuantile10=分位数(`numbers`,c(.100)))
问题:有人能帮我使用这三种方法(不是一种,但最好是所有学习方法)生成上述输出吗

1) 拉普拉

2) dplyr

3) 数据表


我看了几个线程,但它们都讨论了一个特定的分位数,而不是全部。例如,线程。

我们可以使用
数据表
以一种紧凑的方式完成此操作。将“data.frame”转换为“data.table”(
setDT(IData)
),按“let”分组,获取“number”的
分位数,并将其转换为
list
as.list


我们可以使用
data.table
以紧凑的方式实现这一点。将“data.frame”转换为“data.table”(
setDT(IData)
),按“let”分组,获取“number”的
分位数,并将其转换为
list
as.list


要将我的评论组合成一个答案,base非常简单:

aggregate(numbers ~ let, IData, quantile, seq(0.1, 1, 0.1))

##    let numbers.10% numbers.20% numbers.30% numbers.40% numbers.50% numbers.60% numbers.70% numbers.80% ...
## 1    A      1749.8      3847.8      5562.6      7475.2      9926.0     11758.6     13230.6     15788.8
## 2    B      2393.5      4483.6      6359.1      7708.0      9773.0     11842.8     13468.9     16266.4
## 3    C      2041.5      3682.0      5677.5      7504.0      9226.0     11470.0     13628.5     15379.0
## 4    D      1890.7      4086.8      5661.9      7526.6      9714.0     11438.8     13969.2     15967.2
## 5    E      2083.6      4107.0      6179.8      7910.8     10095.0     11692.6     13668.0     15570.2
## 6    F      1936.6      4220.2      6197.0      8791.8     10382.0     12266.4     14589.2     16407.0
## 7    G      3059.4      4884.2      6519.6      8530.0     10481.0     12469.0     14401.6     16127.8
## 8    H      2186.5      4081.0      5801.5      7206.0      9256.5     11453.0     13692.0     15471.0
## 9    I      1534.1      3793.2      5822.2      7621.4      9417.5     11737.0     14191.2     15722.4
## 10   J      1967.2      4286.6      5829.6      7664.6     10606.0     12217.4     14422.2     16628.0
## ...
需要注意的是,
numbers
实际上是一个嵌套列,可能需要解包以供进一步使用

dplyr
在使用列表列或
do
并重塑形状时起作用:

library(tidyverse)

IData %>% group_by(let) %>% 
    summarise(quant_prob = list(paste0('quant', seq(.1, 1, .1))), 
              quant_value = list(quantile(numbers, seq(.1, 1, .1)))) %>% 
    unnest() %>% 
    spread(quant_prob, quant_value)

## # A tibble: 26 × 11
##       let quant0.1 quant0.2 quant0.3 quant0.4 quant0.5 quant0.6 quant0.7 quant0.8 quant0.9 quant1
## *  <fctr>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>  <dbl>
## 1       A   1749.8   3847.8   5562.6   7475.2   9926.0  11758.6  13230.6  15788.8  17763.0  19958
## 2       B   2393.5   4483.6   6359.1   7708.0   9773.0  11842.8  13468.9  16266.4  17877.4  19929
## 3       C   2041.5   3682.0   5677.5   7504.0   9226.0  11470.0  13628.5  15379.0  17265.0  19876
## 4       D   1890.7   4086.8   5661.9   7526.6   9714.0  11438.8  13969.2  15967.2  17961.0  19989
## 5       E   2083.6   4107.0   6179.8   7910.8  10095.0  11692.6  13668.0  15570.2  18011.4  19887
## 6       F   1936.6   4220.2   6197.0   8791.8  10382.0  12266.4  14589.2  16407.0  18345.0  19997
## 7       G   3059.4   4884.2   6519.6   8530.0  10481.0  12469.0  14401.6  16127.8  18219.2  19922
## 8       H   2186.5   4081.0   5801.5   7206.0   9256.5  11453.0  13692.0  15471.0  17331.0  19996
## 9       I   1534.1   3793.2   5822.2   7621.4   9417.5  11737.0  14191.2  15722.4  17706.6  19965
## 10      J   1967.2   4286.6   5829.6   7664.6  10606.0  12217.4  14422.2  16628.0  18091.2  19901
## # ... with 16 more rows

尽管列名有点糟糕。

要将我的评论汇总成答案,base的简单程度令人震惊:

aggregate(numbers ~ let, IData, quantile, seq(0.1, 1, 0.1))

##    let numbers.10% numbers.20% numbers.30% numbers.40% numbers.50% numbers.60% numbers.70% numbers.80% ...
## 1    A      1749.8      3847.8      5562.6      7475.2      9926.0     11758.6     13230.6     15788.8
## 2    B      2393.5      4483.6      6359.1      7708.0      9773.0     11842.8     13468.9     16266.4
## 3    C      2041.5      3682.0      5677.5      7504.0      9226.0     11470.0     13628.5     15379.0
## 4    D      1890.7      4086.8      5661.9      7526.6      9714.0     11438.8     13969.2     15967.2
## 5    E      2083.6      4107.0      6179.8      7910.8     10095.0     11692.6     13668.0     15570.2
## 6    F      1936.6      4220.2      6197.0      8791.8     10382.0     12266.4     14589.2     16407.0
## 7    G      3059.4      4884.2      6519.6      8530.0     10481.0     12469.0     14401.6     16127.8
## 8    H      2186.5      4081.0      5801.5      7206.0      9256.5     11453.0     13692.0     15471.0
## 9    I      1534.1      3793.2      5822.2      7621.4      9417.5     11737.0     14191.2     15722.4
## 10   J      1967.2      4286.6      5829.6      7664.6     10606.0     12217.4     14422.2     16628.0
## ...
需要注意的是,
numbers
实际上是一个嵌套列,可能需要解包以供进一步使用

dplyr
在使用列表列或
do
并重塑形状时起作用:

library(tidyverse)

IData %>% group_by(let) %>% 
    summarise(quant_prob = list(paste0('quant', seq(.1, 1, .1))), 
              quant_value = list(quantile(numbers, seq(.1, 1, .1)))) %>% 
    unnest() %>% 
    spread(quant_prob, quant_value)

## # A tibble: 26 × 11
##       let quant0.1 quant0.2 quant0.3 quant0.4 quant0.5 quant0.6 quant0.7 quant0.8 quant0.9 quant1
## *  <fctr>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>  <dbl>
## 1       A   1749.8   3847.8   5562.6   7475.2   9926.0  11758.6  13230.6  15788.8  17763.0  19958
## 2       B   2393.5   4483.6   6359.1   7708.0   9773.0  11842.8  13468.9  16266.4  17877.4  19929
## 3       C   2041.5   3682.0   5677.5   7504.0   9226.0  11470.0  13628.5  15379.0  17265.0  19876
## 4       D   1890.7   4086.8   5661.9   7526.6   9714.0  11438.8  13969.2  15967.2  17961.0  19989
## 5       E   2083.6   4107.0   6179.8   7910.8  10095.0  11692.6  13668.0  15570.2  18011.4  19887
## 6       F   1936.6   4220.2   6197.0   8791.8  10382.0  12266.4  14589.2  16407.0  18345.0  19997
## 7       G   3059.4   4884.2   6519.6   8530.0  10481.0  12469.0  14401.6  16127.8  18219.2  19922
## 8       H   2186.5   4081.0   5801.5   7206.0   9256.5  11453.0  13692.0  15471.0  17331.0  19996
## 9       I   1534.1   3793.2   5822.2   7621.4   9417.5  11737.0  14191.2  15722.4  17706.6  19965
## 10      J   1967.2   4286.6   5829.6   7664.6  10606.0  12217.4  14422.2  16628.0  18091.2  19901
## # ... with 16 more rows

尽管列名有点糟糕。

library(tidyverse);IData%>%group_by(let)%%>%summary(quant_prob=list(paste0('quant',seq(.1,1,1))),quant_value=list(quantile(numbers,seq(.1,1)))%%>%unest()%%>%spread(quant_prob,quant_value)
也许,尽管把它放长一点可能更有用form@Alistaire-谢谢你的帮助。你认为你也可以帮助我使用
lappy
数据.Table
版本,这样我就可以学习解决同一问题的新方法吗?嗯,显然base R的想法和你的想法一样:
聚合(数字~let,IData,分位数,seq(.1,1,.1))
库(tidyverse);IData%>%group_by(let)%%>%summary(quant_prob=list(paste0('quant',seq(.1,1,1))),quant_value=list(quantile(numbers,seq(.1,1)))%%>%unest()%%>%spread(quant_prob,quant_value)
也许,尽管把它放长一点可能更有用form@Alistaire-谢谢你的帮助。你认为你也可以帮助我使用
lappy
数据表版本,这样我就可以学习解决同样问题的新方法吗?嗯,显然base R的想法和你的想法一样:
聚合(数字~let,IData,分位数,seq(.1,1,.1))
我喜欢你对R的深入了解。你认为你可以包括一个
lappy
版本吗?我是R新手,非常想掌握
lappy
。我衷心感谢您的帮助。
lappy
不分组,因此在这里没有真正的用处。您可以使用
tapply
,比如
do.call(rbind,tapply(IData$numbers,IData$let,quantile,seq(.1,1,1))
(它返回一个矩阵而不是一个data.frame),但实际上,
aggregate
版本是最合适的基本R方法。我喜欢你对R的深入了解。你认为你可以包括一个
lappy
版本吗?我是R新手,非常想掌握
lappy
。我衷心感谢您的帮助。
lappy
不分组,因此在这里没有真正的用处。您可以使用
tapply
,比如
do.call(rbind,tapply(IData$numbers,IData$let,quantile,seq(.1,1,.1))
(它返回一个矩阵而不是一个data.frame),但实际上
aggregate
版本是最合适的base R方法。
IData %>% group_by(let) %>% 
    by_slice(~quantile(.x$numbers, seq(0.1, 1, 0.1)), .collate = "cols")

## # A tibble: 26 × 11
##       let  .out1  .out2  .out3  .out4   .out5   .out6   .out7   .out8   .out9 .out10
##    <fctr>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>
## 1       A 1749.8 3847.8 5562.6 7475.2  9926.0 11758.6 13230.6 15788.8 17763.0  19958
## 2       B 2393.5 4483.6 6359.1 7708.0  9773.0 11842.8 13468.9 16266.4 17877.4  19929
## 3       C 2041.5 3682.0 5677.5 7504.0  9226.0 11470.0 13628.5 15379.0 17265.0  19876
## 4       D 1890.7 4086.8 5661.9 7526.6  9714.0 11438.8 13969.2 15967.2 17961.0  19989
## 5       E 2083.6 4107.0 6179.8 7910.8 10095.0 11692.6 13668.0 15570.2 18011.4  19887
## 6       F 1936.6 4220.2 6197.0 8791.8 10382.0 12266.4 14589.2 16407.0 18345.0  19997
## 7       G 3059.4 4884.2 6519.6 8530.0 10481.0 12469.0 14401.6 16127.8 18219.2  19922
## 8       H 2186.5 4081.0 5801.5 7206.0  9256.5 11453.0 13692.0 15471.0 17331.0  19996
## 9       I 1534.1 3793.2 5822.2 7621.4  9417.5 11737.0 14191.2 15722.4 17706.6  19965
## 10      J 1967.2 4286.6 5829.6 7664.6 10606.0 12217.4 14422.2 16628.0 18091.2  19901
## # ... with 16 more rows