将数据框分成 5 个部分并为每个部分使用 describe 函数
Split dataframe into 5 parts and use describe function for every part
我有这样一个数据框:
df <- data.frame(x = 1:100, y = runif(100))
我把它分成了 5 个部分:
z <- split(df, rep(1:5, length.out = nrow(df), each = ceiling(nrow(df)/5)))
现在我正在尝试为 z
中的每个部分查找描述性统计信息,但出现此错误:(我实际上有兴趣在这些中查找 df$y
列的描述性统计信息5 份。)
psych::describe(z,na.rm = TRUE)
Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
is.atomic(x) is not TRUE
Ek olarak: Warning message:
In mean.default(x, na.rm = na.rm) :
argument is not numeric or logical: returning NA
我正在尝试找到类似这样的内容:(可能看起来不像 z[1]$y
,但假设这就是我正在尝试查找的内容)
vars n mean sd median trimmed mad min max range skew kurtosis se
z[1]$y 5 44813 0.02 0.17 0.00 0.01 0.10 -0.97 8.87 9.84 6.19 211.87 0.00
....
z[5]$y 6 45220 0.15 0.07 0.14 0.15 0.05 0.05 0.81 0.76 3.83 31.53 0.00
此外,我如何才能仅对 z[1]
或 z[5]
中的 y
值使用 describe 函数?
我不确定如何处理此处的列表,因此感谢并感谢您的回复。
我认为您可以使用以下解决方案。我不熟悉您正在使用的 describe
函数,但是如果它以向量作为第一个参数,您可以使用包 purrr
的 imap
函数来指定您只想应用您的函数在第 1
个和第 5
个元素上。 imap
中的 .y
参数指的是 positions/names 因为 .x
指的是值:
library(dplyr)
library(purrr)
imap(z, ~ if(.y %in% c(1, 5)) {
describe(.x[["y"]])
} else {
.x
})
这是我亲爱的朋友@akrun 建议的另一个更紧凑的基础 R 解决方案:
z[c("1", "5")] <- lapply(z[c("1", "5")], describe)
我们可以使用lapply
library(psych)
n <- 20
nr <- nrow(df)
z <- split(df, rep(1:ceiling(nr/n), each=n, length.out=nr))
lapply(z, psych::describe)
输出:
$`1`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 10.50 5.92 10.5 10.50 7.41 1 20.00 19.00 0.00 -1.38 1.32
y 2 20 0.37 0.30 0.3 0.34 0.32 0 0.96 0.96 0.47 -1.13 0.07
$`2`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 30.50 5.92 30.50 30.50 7.41 21.00 40.00 19.00 0.00 -1.38 1.32
y 2 20 0.43 0.29 0.39 0.42 0.34 0.01 0.96 0.95 0.41 -1.14 0.06
$`3`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 50.50 5.92 50.50 50.50 7.41 41.00 60.00 19.00 0.00 -1.38 1.32
y 2 20 0.55 0.34 0.51 0.56 0.49 0.03 0.98 0.95 -0.08 -1.62 0.08
$`4`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 70.50 5.92 70.50 70.50 7.41 61.00 80.00 19.00 0.00 -1.38 1.32
y 2 20 0.52 0.27 0.46 0.52 0.39 0.15 0.94 0.79 0.12 -1.59 0.06
$`5`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 90.50 5.92 90.50 90.50 7.41 81.00 100.00 19.00 0.00 -1.38 1.32
y 2 20 0.62 0.33 0.65 0.65 0.43 0.01 0.99 0.98 -0.33 -1.48 0.07
我有这样一个数据框:
df <- data.frame(x = 1:100, y = runif(100))
我把它分成了 5 个部分:
z <- split(df, rep(1:5, length.out = nrow(df), each = ceiling(nrow(df)/5)))
现在我正在尝试为 z
中的每个部分查找描述性统计信息,但出现此错误:(我实际上有兴趣在这些中查找 df$y
列的描述性统计信息5 份。)
psych::describe(z,na.rm = TRUE)
Error in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
is.atomic(x) is not TRUE
Ek olarak: Warning message:
In mean.default(x, na.rm = na.rm) :
argument is not numeric or logical: returning NA
我正在尝试找到类似这样的内容:(可能看起来不像 z[1]$y
,但假设这就是我正在尝试查找的内容)
vars n mean sd median trimmed mad min max range skew kurtosis se
z[1]$y 5 44813 0.02 0.17 0.00 0.01 0.10 -0.97 8.87 9.84 6.19 211.87 0.00
....
z[5]$y 6 45220 0.15 0.07 0.14 0.15 0.05 0.05 0.81 0.76 3.83 31.53 0.00
此外,我如何才能仅对 z[1]
或 z[5]
中的 y
值使用 describe 函数?
我不确定如何处理此处的列表,因此感谢并感谢您的回复。
我认为您可以使用以下解决方案。我不熟悉您正在使用的 describe
函数,但是如果它以向量作为第一个参数,您可以使用包 purrr
的 imap
函数来指定您只想应用您的函数在第 1
个和第 5
个元素上。 imap
中的 .y
参数指的是 positions/names 因为 .x
指的是值:
library(dplyr)
library(purrr)
imap(z, ~ if(.y %in% c(1, 5)) {
describe(.x[["y"]])
} else {
.x
})
这是我亲爱的朋友@akrun 建议的另一个更紧凑的基础 R 解决方案:
z[c("1", "5")] <- lapply(z[c("1", "5")], describe)
我们可以使用lapply
library(psych)
n <- 20
nr <- nrow(df)
z <- split(df, rep(1:ceiling(nr/n), each=n, length.out=nr))
lapply(z, psych::describe)
输出:
$`1`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 10.50 5.92 10.5 10.50 7.41 1 20.00 19.00 0.00 -1.38 1.32
y 2 20 0.37 0.30 0.3 0.34 0.32 0 0.96 0.96 0.47 -1.13 0.07
$`2`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 30.50 5.92 30.50 30.50 7.41 21.00 40.00 19.00 0.00 -1.38 1.32
y 2 20 0.43 0.29 0.39 0.42 0.34 0.01 0.96 0.95 0.41 -1.14 0.06
$`3`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 50.50 5.92 50.50 50.50 7.41 41.00 60.00 19.00 0.00 -1.38 1.32
y 2 20 0.55 0.34 0.51 0.56 0.49 0.03 0.98 0.95 -0.08 -1.62 0.08
$`4`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 70.50 5.92 70.50 70.50 7.41 61.00 80.00 19.00 0.00 -1.38 1.32
y 2 20 0.52 0.27 0.46 0.52 0.39 0.15 0.94 0.79 0.12 -1.59 0.06
$`5`
vars n mean sd median trimmed mad min max range skew kurtosis se
x 1 20 90.50 5.92 90.50 90.50 7.41 81.00 100.00 19.00 0.00 -1.38 1.32
y 2 20 0.62 0.33 0.65 0.65 0.43 0.01 0.99 0.98 -0.33 -1.48 0.07