【问题标题】:how to get row names from the apply() function output?如何从 apply() 函数输出中获取行名?
【发布时间】:2020-01-21 23:33:39
【问题描述】:

我正在学习 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 都没有成功。

【问题讨论】:

  • 感谢您的帮助 Ronak Shah,您的解释让我清醒了。

标签: r apply tibble rowname


【解决方案1】:

这里,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

【讨论】:

    【解决方案2】:

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

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

    现在,我们可以在temp$values 中访问所有带有temp$indsd 值的列名。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2013-01-31
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多