R语言 如何从apply()函数的输出中获取行名称?

c0vxltue  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(127)

我正在学习R语言,并使用了一些世界银行的数据。我在列的一个切片中使用了apply()函数,并对值应用了标准差,如下所示:result <- apply(df[6:46],2,sd,na.rm=TRUE)
结果是一个有两列的对象,没有标题,一列是所有被选中的tibble列的名称,另一列是每列的标准差。当我在输出中使用typeof()命令时,结果是'double'。R文档说apply()的输出是一个向量,数组或列表。
我需要知道这一点,因为我想提取所有的行名称,并使用命令rownames(result)抛出输出NULL。我可以做什么来提取这个对象的行名称?

尝试了rownames(result)row.names(result,没有一个工作。

e0bqpujr

e0bqpujr1#

我们可以使用stack将vector输出转换为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))
tkqqtvp1

tkqqtvp12#

在这里,sd返回一个值,并且由于applyMARGIN = 2 i,e按列排列,我们得到一个命名的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的输出 Package 为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

相关问题