sapply - сохранить имена столбцов

Я пытаюсь суммировать среднее значение, SD и т. Д. Для ряда различных столбцов (переменных) в моем наборе данных. Я кодировал свою собственную функцию суммирования, чтобы вернуть именно то, что мне нужно, и использую sapply, чтобы применить эту функцию ко всем переменным одновременно. Он работает нормально, однако возвращаемый фрейм данных не имеет имен столбцов, и я не могу даже переименовать их, используя ссылку на номер столбца - иначе они кажутся невозможными для использования каким-либо образом.

Мой код ниже - так как я просто нахожу сводную статистику, я хотел бы просто использовать те же имена столбцов (переменных), с 4 строками (среднее, sd, min, max). Есть ли способ сделать это (даже медленный способ, когда я вручную изменяю имена столбцов)

 #GENERATING DESCRIPTIVE STATISTICS
sfsum= function(x){
  mean=mean(x)
  sd=sd(x)
  min=min(x)
  max=max(x)

  return(c(mean,sd,min,max))
}

#
c= list(sfbalanced$age_child, sfbalanced$earnings_child, 
sfbalanced$logchildinc ,sfbalanced$p_inc84, sfbalanced$login84, 
sfbalanced$p_inc85, sfbalanced$login85, sfbalanced$p_inc86, 
sfbalanced$login86, sfbalanced$p_inc87, sfbalanced$login87, 
sfbalanced$p_inc88, sfbalanced$login88)

summ=sapply(c,sfsum)

names(summ)
 NULL

2 ответа

Если вы предоставляете имена в ответ во время определения функции, вы можете иметь имена строк в качестве имен функций, если вы предоставляете имена списков при определении вашего объекта, вы можете использовать USE.NAMES в sapply чтобы получить имена автоматически.

Пример на mtcars данные могут дать вам следующий вывод.

Код

sfsum= function(x){
    mean=mean(x)
    sd=sd(x)
    min=min(x)
    max=max(x)

    return(c("mean"=mean,"sd"=sd,"min" = min,"max" =max)) #For rownames
}

#
x= list("mpg" = mtcars$mpg, "disp" = mtcars$disp, "drat" = mtcars$drat)
#For column names

summ=sapply(x,sfsum, USE.NAMES = TRUE) #USE.NAMES = TRUE to get names on top

Выход:

> summ
           mpg     disp      drat
mean 20.090625 230.7219 3.5965625
sd    6.026948 123.9387 0.5346787
min  10.400000  71.1000 2.7600000
max  33.900000 472.0000 4.9300000

Если нам также нужны имена столбцов, просто переберите набор данных (при условии, что мы применяем функцию ко всем столбцам)

out <- sapply(df2, sfsum)
row.names(out) <- c('mean', 'sd', 'min', 'max')

данные

set.seed(24)
df2 <- as.data.frame(matrix(rnorm(4*4), 4, 4))
Другие вопросы по тегам