r-将数据帧拆分为5个部分,并对每个部分使用描述函数



我有一个这样的数据帧:

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中找到每个部分的描述性统计数据,但我得到了这个错误:(我实际上对在这5个部分中找到df$y列的描述性统计很感兴趣。(

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值使用描述函数?

我不知道如何处理这里的列表,所以感谢并感谢您的回复。

我们可以使用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

我认为您可以使用以下解决方案。我不熟悉你正在使用的describe函数,但如果它以向量为第一个参数,你可以使用包purrrimap函数来指定你只想在1st&CCD_ 12元素。imap中的.y自变量指的是位置/名称,而.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)

最新更新