Как я могу суммировать таблицу в R путем преобразования определенных имен строк в имена столбцов и подсчета вхождений? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть некоторые данные, которые выглядят так:

 `Category` `Count`
   <chr>        <chr>   
 1 X0101       <NA>    
 2 17           1       
 3 22           1       
 4 23           1       
 5 27           1       
 6 34           1       
 7 35           2       
 8 40           1       
 9 51           1       
10 66           1       
11 X0102     <NA>    
12 51           1       
13 53           1       
14 59           1       
15 61           1       
16 X0103     <NA>    
17 10           1       
18 22           1       
19 17           1   

Этот код используется для создания моего кадра данных:

 structure(list(`Row Labels` = c("X0101", "17", "22", "23", 
    "27", "34", "35", "40", "51", "66", "X0102", "51", "53", 
    "59", "61", "X0103", "10", "22", "17"), `Count` = c(NA, 
    "1", "1", "1", "1", "1", "2", "1", "1", "1", NA, "1", "1", "1", 
    "1", NA, "1", "1", "1")), .Names = c("Category", "Count"), row.names = c(NA, 
    -19L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы изменить свою таблицу так, чтобы у меня были только строки с именами "X0101", "X0102", "X0103" и столбцы, которые будут состоять из числа для каждой из подкатегорий. Я новичок в R и не знаю, какой код достигнет этого.

Вот как будет выглядеть мой желаемый результат:

Category   10  17  22  23  27  34  35  40  51  53  59  61  66  
X0101          1   1   1   1   1   2   1   1                1
X0102                                     1        1   1
X0103     1  1   1

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Вот один из способов сделать это, используя dplyr и tidyr.Получить все нечисловые значения в столбце Category (vals), создать переменную factor, используя cumsum и labels в качестве vals, удалить строки NA и spread в широкоформатном формате,

library(dplyr)
library(tidyr)

vals <- grep("^\\d+$", df$Category, invert = TRUE, value = TRUE)

df %>%
  mutate(temp = factor(cumsum(Category %in% vals), labels = vals)) %>%
  na.omit %>%
  spread(Category, Count)

# A tibble: 3 x 14
#  temp   `10`  `17`  `22`  `23`  `27`  `34`  `35`  `40`  `51`  `53`  `59`  `61`  `66` 
#  <fct>  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 Lower  NA    1     1     1     1     1     2     1     1     NA    NA    NA    1    
#2 Higher NA    NA    NA    NA    NA    NA    NA    NA    1     1     1     1     NA   
#3 Medium 1     1     1     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA   
0 голосов
/ 09 июля 2019

Одна dplyr и tidyr возможность может быть:

df %>%
 group_by(grp = cumsum(is.na(Count))) %>%
 mutate(Category2 = first(Category)) %>%
 ungroup() %>%
 na.omit() %>%
 select(-grp) %>%
 spread(Category, Count)

  Category2 `10`  `17`  `22`  `23`  `27`  `34`  `35`  `40`  `51`  `53`  `59`  `61` 
  <chr>     <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Higher    <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  1     1     1     1    
2 Lower     <NA>  1     1     1     1     1     2     1     1     <NA>  <NA>  <NA> 
3 Medium    1     1     1     <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...