Добавление эквивалентных столбцов соответствующих данных в R - PullRequest
0 голосов
/ 25 апреля 2018

Я создал категоризированную таблицу тегов из необработанных данных, используя table ().

Я хочу добавить частоту / количество соответствующих тегов. Например `

S/n No.     Tags    Frequency/Count

1      Problem 1      56325
2      Problem 2      11233
3      Problem 3      546321
4      Problem 1      2123345 
       & Problem 2      
5      Problem 2      9657531
       & Problem 3
6      Problem 1      623589542
       & Problem 2
       & Problem 3 ` 

Теперь я хочу, чтобы результат был примерно таким,

S/n no.  Tagging     Freq/Count

1        Problem 1  (56325+2123345+623589542)=625769212
2        Problem 2  (11233+2123345+9657531+623589542)=635381651
3        Problem 3  (546321+9657531+623589542)=633793394

Примечание. Данные внутри () не должны отображаться в выходных данных.

Теперь у меня есть 78 различных типов тегов ключевых слов. И около 250 строк в таблице.

На этот вопрос правильно ответили @Maurits Evers и @akrun. Для этого вам нужно будет установить пакет tidyverse. Пожалуйста, введите

install.packages ( "tidyverse")

в консоли R, если у вас не установлена ​​. Посетите сайт tidyverse для получения дополнительной информации.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Data.table решение с использованием tstrsplit

library(data.table)
setDT(df)[,.(Tags = unlist(tstrsplit(Tags, " & ", fixed = TRUE)), # Split by &
             Freq = Frequency_Count) # Take the Frequency_Count too
          ][!is.na(Tags), # ignore non-matches
            .(Freq_Count = sum(Freq)), # sum frequencies
            by = Tags] # by the splitted tags
#         Tags Freq_Count
# 1: Problem 1  625769212
# 2: Problem 2  635381651
# 3: Problem 3  633793394
0 голосов
/ 25 апреля 2018

Предполагая, что вы имели в виду Задача 1 и Проблема 2, для обеих частот - 2123345, я прочитал ваши данные, как показано ниже, и использовал агрегатную функцию, чтобы получить результаты, которые, как вы предполагали, вам нужны:

table1 <- read.table(text = '
  Tags    FrequencyCount
  Problem1      56325
  Problem2      11233
  Problem3      546321
  Problem1      2123345 
  Problem2     2123345
  Problem2     9657531
  Problem3     9657531
  Problem1     623589542
  Problem2     623589542
  Problem3     623589542',
                 header = TRUE) 


aggregate(FrequencyCount ~ Tags, table1, sum)

      Tags FrequencyCount
1 Problem1      625769212
2 Problem2      635381651
3 Problem3      633793394

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

table1 <- read.table(text = '
  Tags    FrequencyCount
  Problem1      56325
  Problem2      11233
  Problem3      546321
  Problem1      2123345 
  Problem2     NA
  Problem2     9657531
  Problem3     NA
  Problem1     623589542
  Problem2     NA
  Problem3     NA',
                 header = TRUE) 

library(data.table)
while(sum(is.na(table1$FrequencyCount)) > 0){
table1$FrequencyCount <- ifelse(is.na(table1$FrequencyCount), 
shift(table1$FrequencyCount), table1$FrequencyCount)
}
0 голосов
/ 25 апреля 2018

Вот один вариант с separate_rows

library(tidyverse)
df1 %>% 
  separate_rows(Tags, sep = "\\s+&\\s+") %>% 
  group_by(Tags) %>% 
  summarise(SN_No = first(SN_No), Frequency_Count = sum(Frequency_Count)) %>%
  select(names(df1))
# A tibble: 3 x 3
#    SN_No Tags      Frequency_Count
#   <int> <chr>               <int>
#1     1 Problem 1       625769212
#2     2 Problem 2       635381651
#3     3 Problem 3       633793394

данными

df1 <- structure(list(SN_No = 1:6, Tags = structure(c(1L, 4L, 6L, 2L, 
 5L, 3L), .Label = c("Problem 1", "Problem 1 & Problem 2", 
  "Problem 1 & Problem 2 & Problem 3", 
 "Problem 2", "Problem 2 & Problem 3", "Problem 3"), class = "factor"), 
Frequency_Count = c(56325L, 11233L, 546321L, 2123345L, 9657531L, 
623589542L)), .Names = c("SN_No", "Tags", "Frequency_Count"
 ), class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 25 апреля 2018

Обратите внимание, что в вашем примере записи в столбце S/n no., похоже, игнорируются при суммировании счетчиков ; Вы не предоставляете никаких подробностей, поэтому я буду игнорировать записи в этом столбце.

Мы можем использовать strsplit для разделения записей, затем unnest и группировать строки по Tags до summarise значений в столбце Frequency/Count:

library(tidyverse);
df %>%
    mutate_if(is.factor, as.character) %>%
    select(-SN_No) %>%
    mutate(Tags = strsplit(Tags, " & ")) %>%
    unnest() %>%
    group_by(Tags) %>%
    summarise(Freq_Count = sum(Frequency_Count))
## A tibble: 3 x 2
#  Tags      Freq_Count
#  <chr>          <int>
#1 Problem 1  625769212
#2 Problem 2  635381651
#3 Problem 3  633793394  

Пример данных

df <- read.table(text =
    "'SN_No'     Tags    'Frequency_Count'
1      'Problem 1'      56325
2      'Problem 2'      11233
3      'Problem 3'      546321
4      'Problem 1 & Problem 2'     2123345
5      'Problem 2 & Problem 3'      9657531
6      'Problem 1 & Problem 2 & Problem 3'      623589542", header = T)
...