Здесь некоторые столбцы не нумеруются 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))