выбор количества значащих цифр во фрейме данных - PullRequest
1 голос
/ 15 апреля 2019

У меня огромный фрейм данных, образец из 3 столбцов и 11 строк приведен ниже:

df <- structure(list(A = c(61960, 273, 439, 38877, 75325, 80929, 
23028, 57240, 10140, 25775, 7286), B = c(10, 12, 11, 13, 2, 1, 1, 
1, 1, 1, 1), C = c(122, 140, 163, 12, 190, 16, 14, 18, 15, 17, 16
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-11L))

Для каждого столбца фрейма данных я хотел бы рассчитать среднее число значащих цифр для каждого порядка в этом столбце.

Так, например, для вышеприведенного столбца A присутствуют 3 порядка (10 ^ 3, 10 ^ 4, 10 ^ 5). Первое число имеет 4 цифры (последний ноль не считается), второе - 3 и т. Д.

Мой вывод должен представлять собой список для каждого столбца с одним элементом - вектором, содержащим порядки величин, а вторым - срединное число значащих цифр. Таким образом, для каждого столбца, который я ожидаю список, мой вывод будет список списков. Например, для столбца A:

L[["A"]] = list(c(5,4,3), c(5, 4, 3))

Почему этот список? В столбце А есть 3 различных порядка: 10 ^ 5, 10 ^ 4, 10 ^ 3. Среднее число значащих цифр для 10 ^ 5 часов утра составляет 5, для 10 ^ 4, 4 и для 10 ^ 3, 3.

Есть ли способ сделать это эффективно? с чем-то вроде mutate или map (не apply, потому что это будет то же самое, что и использование цикла).

1 Ответ

1 голос
/ 15 апреля 2019

Мы можем сделать это, циклически перебирая столбцы, затем группируя их по nchar столбца, удаляя 0 в конце с sub, получая median и возвращая list медианы по с переменной группировки в tapply (возвращается как имена именованного вектора)

lapply(df, function(x) {
      x1 <- tapply(nchar(sub("0+$", "", x)), nchar(x), FUN = median )
      list(as.integer(names(x1)), as.numeric(x1))

   })
#$A
#$A[[1]]
#[1] 3 4 5

#$A[[2]]
#[1] 3 4 5


#$B
#$B[[1]]
#[1] 1 2

#$B[[2]]
#[1] 1 2


#$C
#$C[[1]]
#[1] 2 3

#$C[[2]]
#[1] 2.0 2.5

Или это также можно сделать с помощью tidyverse и вернуть как один набор данных

library(tidyverse)
df %>%
   mutate_all(str_remove, "0+$") %>%
   map2_dfr(., df,  ~ 
        tibble(x = nchar(.x), grp = nchar(.y)) %>% 
          group_by(grp) %>%
          summarise(x = median(x)), .id = 'colName')
# A tibble: 7 x 3
#  colName   grp     x
#  <chr>   <int> <dbl>
#1 A           3   3  
#2 A           4   4  
#3 A           5   5  
#4 B           1   1  
#5 B           2   2  
#6 C           2   2  
#7 C           3   2.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...