簡體   English   中英

數據幀到矩陣 - 多行

[英]Data Frame to matrix - many rows

我正在嘗試將 data.frame 轉換為矩陣。 我為 iris 數據集計算了一些統計數據,並希望每個統計數據都放在單獨的行中。 下面的代碼在一行中顯示了所有統計數據(平均值和中位數),這不是所需的輸出。 我想要這樣的東西:

stat Sepal.Lenght  Sepal.Width  ....
avg     10.5          .....
med    ......         .....

代碼如下:

data_iris <- iris
avg <- data_iris %>%
  summarise_at(vars(Sepal.Length:Petal.Width),mean,na.rm=TRUE)

med <- data_iris %>%
  summarise_at(vars(Sepal.Length:Petal.Width),median,na.rm=TRUE)


column <- colnames(data_iris[1:4])
rown <- c("avg","median")

df <- data.frame(avg=avg,med=med)
m <- data.matrix(df)

還有一個問題:我想計算分位數但出現錯誤:

qrtl <- data_iris %>%
  summarise_at(vars(Sepal.Length:Petal.Width),quantile,na.rm=TRUE)

錯誤:Column Sepal.Length必須是長度 1(匯總值),而不是 5

怎么了?

如果我們使用pivot_longer其重塑為“long”,則可以完成

library(dplyr)
library(tidyr)
iris %>% 
   summarise_if(is.numeric, list(avg = mean, med = median)) %>% 
   pivot_longer(everything(), names_to = c('.value', 'stat'), names_sep="_")
#    stat Sepal.Length Sepal.Width Petal.Length Petal.Width
#1  avg     5.843333    3.057333        3.758    1.199333
#2  med     5.800000    3.000000        4.350    1.300000

如果需要轉換為matrix ,則將 'stat' 更改為data.matrix ,然后使用data.matrix

library(tibble)
iris %>% 
   summarise_if(is.numeric, list(avg = mean, med = median)) %>% 
   pivot_longer(everything(), names_to = c('.value', 'stat'), names_sep="_") %>% 
   column_to_rownames('stat') %>%
   data.matrix

quantiledplyrdev版本中運行dplyr - 0.8.99.9000`

iris %>%        
    summarise_at(vars(Sepal.Length:Petal.Width),quantile, na.rm=TRUE)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1          4.3         2.0         1.00         0.1
#2          5.1         2.8         1.60         0.3
#3          5.8         3.0         4.35         1.3
#4          6.4         3.3         5.10         1.8
#5          7.9         4.4         6.90         2.5

OP 的包版本是0.8.3 ,所以用list包裝可能會起作用

iris %>%
   summarise_at(vars(Sepal.Length:Petal.Width),
         list(quantile = ~ list(quantile(., na.rm=TRUE)))) %>% 
   unnest(c(names(.)))

我們可以將maptranspose結合使用,然后將來自不同統計數據的行綁定在一起。

library(purrr)

map(data_iris[1:4], ~list(mean = mean(.x), sd = sd(.x))) %>%
  transpose() %>%
  dplyr::bind_rows(.id = "statistics")

# A tibble: 2 x 5
#  statistics Sepal.Length Sepal.Width Petal.Length Petal.Width
#  <chr>             <dbl>       <dbl>        <dbl>       <dbl>
#1 mean              5.84        3.06          3.76       1.20 
#2 sd                0.828       0.436         1.77       0.762

或者

map_df(data_iris[1:4], ~c(mean = mean(.x), sd = sd(.x))) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM