我正在学习R,并且对世界银行的一些数据有所了解。我在列的一部分中使用了apply()函数,并通过以下方式对这些值应用了标准偏差:result <- apply(df[6:46],2,sd,na.rm=TRUE)
。
结果是一个对象有两列没有标题,一列是所选小标题列的所有名称,另一列是每列的标准偏差。当我在输出中使用typeof()命令时,结果为'double'
。 R文档说apply()的输出是向量,数组或列表。
我需要知道这一点,因为我想提取所有行名,并使用命令rownames(result)
抛出输出NULL
。如何提取该对象的行名?请帮忙。
尝试过rownames(result)
和row.names(result
,但都没有成功。
答案 0 :(得分:2)
在这里,sd
返回单个值,并且当apply
与MARGIN = 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
或转换为list
和enframe
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$ind
和sd
中temp$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
我们也可以将其用于sapply
和lapply
stack(sapply(mtcars,sd, na.rm = TRUE))
#and
stack(lapply(mtcars,sd, na.rm = TRUE))