如何从 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 是一个单一的值,因为 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"
此外,通过用 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
或转换为 list
和 enframe
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
我们也可以将其与 sapply
和 lapply
一起使用
stack(sapply(mtcars,sd, na.rm = TRUE))
#and
stack(lapply(mtcars,sd, na.rm = TRUE))
我正在学习 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 是一个单一的值,因为 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"
此外,通过用 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
或转换为 list
和 enframe
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
我们也可以将其与 sapply
和 lapply
stack(sapply(mtcars,sd, na.rm = TRUE))
#and
stack(lapply(mtcars,sd, na.rm = TRUE))