我有一个这样的数据帧:
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
函数,但如果它以向量为第一个参数,你可以使用包purrr
的imap
函数来指定你只想在1
st&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)