Средство вычисления столбцов для числовых столбцов фрейма данных R, отображение значения по умолчанию для нечисловых столбцов c - PullRequest
1 голос
/ 28 апреля 2020

Для фрейма данных R, где все столбцы имеют номера c, я могу использовать colMeans для вычисления средних значений столбцов. Есть ли способ в R распознать, какие столбцы не являются числами c и установить для этих средств столбцов какое-либо значение по умолчанию, такое как -999? Данные выглядят так:

  sym   mkt_ret  NAV_ret     diff  premium      mkt      NAV    mkt_time    nav_time
 NRGX    -3.31    -0.25     -3.06    -4.16     7.60     7.93 04-27@16:02 04-27@20:01
  PCI    -2.31     0.36     -2.67     3.46    17.36    16.78 04-27@16:02 04-27@20:01
  PDI     0.28     0.34     -0.06    11.95    23.24    20.76 04-27@16:02 04-27@20:01

Для кода

infile = "table.txt"
xx = read.table(infile,header=TRUE)
print(xx)
print(colMeans(xx,na.rm=TRUE))

Я получаю ошибку

Error in colMeans(xx, na.rm = TRUE) : 'x' must be numeric
Calls: print -> colMeans
Execution halted

1 Ответ

1 голос
/ 28 апреля 2020

Здесь некоторые столбцы не нумеруются c, если мы удаляем эти столбцы с помощью индексации, он должен работать

i1 <- sapply(xx, is.numeric) # create a logical vector for numeric columns
out <- setNames(rep(-999, ncol(xx)), names(xx)) # initialize a vector with -999
out[i1] <- colMeans(xx[i1], na.rm = TRUE) # assign the colMeans to update

out
#      sym    mkt_ret    NAV_ret       diff    premium        mkt        NAV   mkt_time   nav_time 
#-999.00000   -1.78000    0.15000   -1.93000    3.75000   16.06667   15.15667 -999.00000 -999.00000 

С tidyverse мы можем использовать summarise_if

library(dplyr)
xx %>%
     summarise_if(is.numeric, mean, na.rm = TRUE)

Или измените ненулевые значения столбца c на -999, а затем используйте summarise_all или colMeans

library(purrr)
xx %>%
   mutate_if(negate(is.numeric), ~ -999) %>%
   colMeans(na.rm = TRUE)
#       sym    mkt_ret    NAV_ret       diff    premium        mkt        NAV   mkt_time   nav_time 
#-999.00000   -1.78000    0.15000   -1.93000    3.75000   16.06667   15.15667 -999.00000 -999.00000 

Или другой параметр - lapply и передать if/else функцию

sapply(xx, function(x) if(is.numeric(x)) mean(x,  na.rm = TRUE) else -999)

Кроме того, если мы используем mean вместо colMeans, он все равно будет работать, генерируя NA для тех столбцов, которые не имеют чисел c значения (хотя будет предупреждение)

sapply(xx, mean)
#   sym  mkt_ret  NAV_ret     diff  premium      mkt      NAV mkt_time nav_time 
#     NA -1.78000  0.15000 -1.93000  3.75000 16.06667 15.15667       NA       NA 

данные

xx <- structure(list(sym = c("NRGX", "PCI", "PDI"), mkt_ret = c(-3.31, 
-2.31, 0.28), NAV_ret = c(-0.25, 0.36, 0.34), diff = c(-3.06, 
-2.67, -0.06), premium = c(-4.16, 3.46, 11.95), mkt = c(7.6, 
17.36, 23.24), NAV = c(7.93, 16.78, 20.76), mkt_time = c("04-27@16:02", 
"04-27@16:02", "04-27@16:02"), nav_time = c("04-27@20:01", "04-27@20:01", 
"04-27@20:01")), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...