[英]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
quantile
在dplyr
的dev
版本中運行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(.)))
我們可以將map
與transpose
結合使用,然后將來自不同統計數據的行綁定在一起。
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.