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

时间:2019-09-21 00:16:02

标签: r apply tibble rowname

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

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

我需要知道这一点,因为我想提取所有行名,并使用命令rownames(result)抛出输出NULL。如何提取该对象的行名?请帮忙。

enter image description here

尝试过rownames(result)row.names(result,但都没有成功。

2 个答案:

答案 0 :(得分:2)

在这里,sd返回单个值,并且当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" 

此外,通过用apply包装data.frame的输出,我们可以使用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

答案 1 :(得分:2)

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

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

现在,我们可以使用temp$indsdtemp$values的值访问所有列名称。

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))