如何从 apply() 函数输出中获取行名?

how to get row names from the apply() function output?

我正在学习 R 并且对一些世界银行的数据有兴趣。我在列的一部分中使用了 apply() 函数,并以这种方式对值应用了标准偏差:result <- apply(df[6:46],2,sd,na.rm=TRUE)

结果是一个 object,有两列没有 header,一列是所有被选中的 tibble 列的名称,另一列是每列的标准差。当我在输出中使用 typeof() 命令时,结果是 'double'。 R 文档说 apply() 的输出是向量、数组或列表。

我需要知道这一点,因为我想提取所有行名称并使用命令 rownames(result) 抛出输出 NULL。我该怎么做才能提取此 object 的行名称?请帮忙。

尝试了 rownames(result)row.names(result 和 none。

在这里,sd returns 是一个单一的值,因为 applyMARGIN = 2 一起,即按列,我们得到一个命名的 vector.所以,names(out) 会得到 names 而不是 row.names。使用内置数据集 iris

的可重现示例
data(iris)
out <- apply(iris[1:4], 2, sd, na.rm = TRUE)
names(out)
#[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 

此外,通过用 data.frame 包装 apply 的输出,我们可以使用 row.names

out1 <- data.frame(val = out)
row.names(out1)
#[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 

如果我们需要一个 data.frame 作为输出,这可以直接用 data.frame 调用

创建
data.frame(names = names(out), values = out)

此外,这可以在 tidyverse

中完成
library(dplyr)
library(tidyr)
iris %>%
     summarise_if(is.numeric, sd, na.rm = TRUE) %>%
     gather
#     key     value
#1 Sepal.Length 0.8280661
#2  Sepal.Width 0.4358663
#3 Petal.Length 1.7652982
#4  Petal.Width 0.7622377

或转换为 listenframe

library(tibble)
iris %>%
    summarise_if(is.numeric, sd, na.rm = TRUE) %>%
    as.list %>% 
    enframe

我们可以使用stack将矢量输出转换为dataframe。

temp <- stack(apply(df[6:46],2,sd,na.rm=TRUE))

现在,我们可以访问temp$ind中的所有列名和temp$values中的值sd

mtcars为例,

temp <- stack(apply(mtcars, 2, sd, na.rm = TRUE))
temp

#      values  ind
#1    6.02695  mpg
#2    1.78592  cyl
#3  123.93869 disp
#4   68.56287   hp
#5    0.53468 drat
#6    0.97846   wt
#7    1.78694 qsec
#8    0.50402   vs
#9    0.49899   am
#10   0.73780 gear
#11   1.61520 carb

我们也可以将其与 sapplylapply

一起使用
stack(sapply(mtcars,sd, na.rm = TRUE))
#and
stack(lapply(mtcars,sd, na.rm = TRUE))