Как сделать таблицу частот из кадра данных в R - PullRequest
1 голос
/ 24 сентября 2019

Фрейм данных выглядит следующим образом: введите описание изображения здесь

header: system
Row 1:  00000000000000000503_0
Row 2:  00000000000000000503_1
Row 3:  00000000000000000503_2
Row 4:  00000000000000000503_3
Row 5:  000000000000000004e7_0
Row 6:  000000000000000004e7_1
Row 7:  00000000000000000681_0
Row 8:  00000000000000000681_1
Row 9:  00000000000000000681_2

Я хочу сгенерировать таблицу частот с количествами кода перед строкой "_", такую ​​что:

«00000000000000000503» появляется 4 раза, «000000000000000004e7» появляется 2 раза и так далее.

Как мне это сделать в R?

Ответы [ 5 ]

1 голос
/ 24 сентября 2019

Опция с str_remove и group_by

library(stringr)
library(dplyr)
df %>%
    group_by(V3 = str_remove(V3, "_\\d+$")) %>% 
    summarise(n = n())
# A tibble: 3 x 2
#  V3                       n
#  <chr>                <int>
#1 000000000000000004e7     2
#2 00000000000000000503     4
#3 00000000000000000681     3

Или в base R с table и trimws

table(trimws(df$V3, whitespace = "_[0-9]+"))

данными

df <- structure(list(V1 = c("Row", "Row", "Row", "Row", "Row", "Row", 
"Row", "Row", "Row"), V2 = c("1:", "2:", "3:", "4:", "5:", "6:", 
"7:", "8:", "9:"), V3 = c("00000000000000000503_0", "00000000000000000503_1", 
"00000000000000000503_2", "00000000000000000503_3", "000000000000000004e7_0", 
"000000000000000004e7_1", "00000000000000000681_0", "00000000000000000681_1", 
"00000000000000000681_2")), class = "data.frame", row.names = c(NA, 
-9L))
1 голос
/ 24 сентября 2019

Тидиверс ответ будет

my_data <-  mydata %>% 
  mutate_if(is.factor, as.character) %>%
  mutate(system = gsub('_[^_]*$', '', system)) %>%
  group_by(system) %>%
  count() %>%
  ungroup()
my_data
1 голос
/ 24 сентября 2019

A dplyr - tidyr альтернатива:

df %>% 
  tidyr::separate(V3, c("target", "non_target")) %>% 
   count(target)
# A tibble: 3 x 2
  target                   n
  <chr>                <int>
1 000000000000000004e7     2
2 00000000000000000503     4
3 00000000000000000681     3

С base:

table(sapply(strsplit(df$system, "_"),"[[", 1))

Данные:

df <- structure(list(V1 = c("Row", "Row", "Row", "Row", "Row", "Row", 
"Row", "Row", "Row"), V2 = c("1:", "2:", "3:", "4:", "5:", "6:", 
"7:", "8:", "9:"), V3 = c("00000000000000000503_0", "00000000000000000503_1", 
"00000000000000000503_2", "00000000000000000503_3", "000000000000000004e7_0", 
"000000000000000004e7_1", "00000000000000000681_0", "00000000000000000681_1", 
"00000000000000000681_2")), class = "data.frame", row.names = c(NA, 
-9L))
1 голос
/ 24 сентября 2019

Другой вариант с использованием библиотеки stringr, включенной в tidyverse

> library(tidyverse)
> mydata <- data.frame(system = c("00000000000000000503_0",
                      "00000000000000000503_1",
                      "00000000000000000503_2",
                      "00000000000000000503_3",
                      "000000000000000004e7_0",
                      "000000000000000004e7_1",
                      "00000000000000000681_0",
                      "00000000000000000681_1",
                      "00000000000000000681_2"))
> mydata
                  system
1 00000000000000000503_0
2 00000000000000000503_1
3 00000000000000000503_2
4 00000000000000000503_3
5 000000000000000004e7_0
6 000000000000000004e7_1
7 00000000000000000681_0
8 00000000000000000681_1
9 00000000000000000681_2
> # Split data using str_split
> mydata$leftside <- sapply(mydata$system, function(x) unlist(str_split(x, "_"))[1]) #split string by the "_" and take first piece
> mydata$rightside <- sapply(mydata$system, function(x) unlist(str_split(x, "_"))[2]) #split string by the "_" and take second piece
> 
> mydata
                  system             leftside rightside
1 00000000000000000503_0 00000000000000000503         0
2 00000000000000000503_1 00000000000000000503         1
3 00000000000000000503_2 00000000000000000503         2
4 00000000000000000503_3 00000000000000000503         3
5 000000000000000004e7_0 000000000000000004e7         0
6 000000000000000004e7_1 000000000000000004e7         1
7 00000000000000000681_0 00000000000000000681         0
8 00000000000000000681_1 00000000000000000681         1
9 00000000000000000681_2 00000000000000000681         2

> # alternative tabulate fuction than base::table(). Can Provide nicer options.
> xtabs(data = mydata, formula = ~leftside)
leftside
000000000000000004e7 00000000000000000503 00000000000000000681 
                   2                    4                    3 
1 голос
/ 24 сентября 2019

Удалите все после подчеркивания и используйте table для подсчета частоты

table(sub("_.*", "", data$col1))
#Also
#table(sub("(.*)_.*", "\\1", data$col1))

#000000000000000004e7 00000000000000000503 00000000000000000681 
#                   2                    4                    3 

Если конечный вывод должен представлять собой фрейм данных, используйте stack

stack(table(sub("_.*", "", data$col1)))

#  values                  ind
#1      2 000000000000000004e7
#2      4 00000000000000000503
#3      3 00000000000000000681

data

data <- structure(list(col1 = structure(c(3L, 4L, 5L, 6L, 1L, 2L, 7L, 
8L, 9L), .Label = c("000000000000000004e7_0", "000000000000000004e7_1", 
"00000000000000000503_0", "00000000000000000503_1", 
"00000000000000000503_2", 
"00000000000000000503_3", "00000000000000000681_0", 
"00000000000000000681_1", 
"00000000000000000681_2"), class = "factor")), class = "data.frame", 
row.names = c(NA, -9L))
...