как получить имена строк из вывода функции apply ()? - PullRequest
2 голосов
/ 21 сентября 2019

Я изучаю 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 ]

2 голосов
/ 21 сентября 2019

Мы можем использовать 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))
2 голосов
/ 21 сентября 2019

Здесь sd возвращает одно значение, и, поскольку apply соответствует MARGIN = 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 с 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 call

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...