![](/img/trans.png)
[英]lapply() output as a dataframe of multiple values with multiple functions - R
[英]lapply() output as a dataframe of multiple functions - R
我一直在嘗試使用lapply()
從幾次計算中創建一個新的 dataframe 。 到目前為止,我已經閱讀了幾個問題( 1 、 2 、 3 ):
lapply(mtcars, function(x) c(colnames(x),
NROW(unique(x)),
sum(is.na(x)),
round(sum(is.na(x))/NROW(x),2)
)
)
但是, colnames(x)
沒有給出 colname 作為x
它是一個向量。 其次,我想不出辦法將這個 output 轉換為 dataframe:
lapply(mtcars, function(x) data.frame(NROW(unique(x)), # if I put colnames(x) here it gives an error
sum(is.na(x)),
round(sum(is.na(x))/NROW(x),2)
)
)
正如您在上面看到的,最終的 dataframe 應該遵循如下結構:
| Variable_name | sum_unique | NA_count | NA_percent |
以下將起作用。 首先,創建一個列表,其中每個元素作為一個數據框,然后將所有數據框組合起來,得到最終的 output。
lst <- lapply(1:ncol(mtcars), function(i){
x <- mtcars[[i]]
data.frame(
Variable_name = colnames(mtcars)[[i]],
sum_unique = NROW(unique(x)),
NA_count = sum(is.na(x)),
NA_percent = round(sum(is.na(x))/NROW(x),2))
})
do.call(rbind, lst)
# Variable_name sum_unique NA_count NA_percent
# 1 mpg 25 0 0
# 2 cyl 3 0 0
# 3 disp 27 0 0
# 4 hp 22 0 0
# 5 drat 22 0 0
# 6 wt 29 0 0
# 7 qsec 30 0 0
# 8 vs 2 0 0
# 9 am 2 0 0
# 10 gear 3 0 0
# 11 carb 6 0 0
由於您使用tidyverse
標記了這篇文章,因此我在這里提供了另一種使用map_dfr
的替代方法,這會產生更簡潔的代碼。
library(tidyverse)
map_dfr(mtcars, function(x){
tibble(sum_unique = NROW(unique(x)),
NA_count = sum(is.na(x)),
NA_percent = round(sum(is.na(x))/NROW(x),2))
}, .id = "Variable_name")
# # A tibble: 11 x 4
# Variable_name sum_unique NA_count NA_percent
# <chr> <int> <int> <dbl>
# 1 mpg 25 0 0
# 2 cyl 3 0 0
# 3 disp 27 0 0
# 4 hp 22 0 0
# 5 drat 22 0 0
# 6 wt 29 0 0
# 7 qsec 30 0 0
# 8 vs 2 0 0
# 9 am 2 0 0
# 10 gear 3 0 0
# 11 carb 6 0 0
最后,使用dplyr
和tidyr
中的函數的另一個解決方案。
mtcars %>%
summarize_all(
list(
sum_unique = function(x) NROW(unique(x)),
NA_count = function(x) sum(is.na(x)),
NA_percent = function(x) round(sum(is.na(x))/NROW(x),2)
)
) %>%
pivot_longer(everything(),
names_to = "column",
values_to = "value") %>%
separate(column, into = c("Variable_name", "parameter"), sep = "_", extra = "merge") %>%
pivot_wider(names_from = "parameter", values_from = "value")
# # A tibble: 11 x 4
# Variable_name sum_unique NA_count NA_percent
# <chr> <int> <int> <dbl>
# 1 mpg 25 0 0
# 2 cyl 3 0 0
# 3 disp 27 0 0
# 4 hp 22 0 0
# 5 drat 22 0 0
# 6 wt 29 0 0
# 7 qsec 30 0 0
# 8 vs 2 0 0
# 9 am 2 0 0
# 10 gear 3 0 0
# 11 carb 6 0 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.