2016-04-27 2 views
0

У меня есть столбец в моей dataframe следующимПодсчитайте количество раз (частота) строка происходит

Col1 
    ---------------------------------------------------------------------------- 
    Center for Animal Control, Division of Hypertension, Department of Medicine 
    Department of Surgery, Division of Primary Care, Center for Animal Control 
    Department of Internal Medicine, Division of Hypertension, Center for Animal Control 

Как подсчитать количество строк, которые происходят, которые отделены друг от друга запятой, другими словами, то, что я пытаюсь сделать, это примерно так:

Affiliation       Freq 
    ------------------------------------------ 
    Center for Animal Control   3 
    Division of Hypertension   2 
    Department of Medicine    1 
    Department of Surgery    1 
    Division of Primary Care   1 
    Department of Internal Medicine  1 

Не мог бы кто-нибудь помочь мне разобраться в этом?

+2

Можете ли вы после того, что вы пытались до сих пор, и что не работает? – celdridge91190

ответ

1

Вот один из подходов. Также замените '\n' запятой, так как у вас есть несколько строк в тексте.

df <- data.frame(col1 = rep("Center for Animal Control, Division of Hypertension, Department of Medicine, Department of Surgery, Division of Primary Care, Center for Animal Control, Department of Internal Medicine, Division of Hypertension, Center for Animal Control", 1), stringsAsFactors = FALSE) 
df$col1 <- gsub('\\n', ', ', df$col1) 
as.data.frame(table(unlist(strsplit(df$col1, ', ')))) 

Выход следующим образом (по исходным данным):

       Var1 Freq 
1  Center for Animal Control 3 
2 Department of Internal Medicine 1 
3   Department of Medicine 1 
4   Department of Surgery 1 
5  Division of Hypertension 2 
6  Division of Primary Care 1 
+0

Что такое 'gsub ('\\ n', ',', df $ col1)' делать? '\ n', поскольку для разлома строки не требуется второй escape, например' \\ n' – thelatemail

+0

Фактически, это не дает правильного результата - «Центр управления животными» повторяется дважды. Вам нужно учитывать пробелы с обеих сторон запятой: 'data.frame (таблица (unlist (strsplit (as.character (df $ col1)", \\ s *, \\ s * "))))' – thelatemail

+0

Bro, ваш код не работает, если col1 имеет значение «Отдел гипертонии, отдел медицины, Центр контроля животных», как и в вашем ответе, для «Центра управления животными» будет создано отдельное поле Affiliation. –

1

Предположение: Center for Animal Control, Division of Hypertension, Department of Medicine это значение для строки 1, Department of Surgery, Division of Primary Care, Center for Animal Control для строки 2 и так далее.

df - это рамка данных.

aff_val <- trimws(unlist(strsplit(df$col1,","))) 

ans <- data.frame(table(aff_val)) 

colnames(ans)[1] <- 'Affiliation' 
+0

Это тот же ответ, что и ниже. – Gopala

+0

@Gopala Пожалуйста, внимательно ознакомьтесь с кодом. Абсолютно не нужно делать вещь gsub, как это сделано в вашем ответе в строке 2, если предположение, сделанное мной, является правильным. Так оно и есть. –

+0

Во входных данных есть новая строка, разделяющая отделы (а не запятая) - пример отдела медицины и отделения хирургии. Они не будут подхвачены 'strsplit' в запятой. – Gopala

0
library(stringr) 
a<-"Center for Animal Control, Division of Hypertension, Department of Medicine 
Department of Surgery, Division of Primary Care, Center for Animal Control 
Department of Internal Medicine, Division of Hypertension, Center for Animal Control" 
con<-textConnection(a) 
tbl<-read.table(con,sep=",") 
vec<-str_trim(unlist(tbl)) 
as.data.frame(table(vec)) 

Ответ

1  Center for Animal Control 3 
2 Department of Internal Medicine 1 
3   Department of Medicine 1 
4   Department of Surgery 1 
5  Division of Hypertension 2 
6  Division of Primary Care 1 
0
text = "Center for Animal Control, Division of Hypertension, Department of Medicine 
Department of Surgery, Division of Primary Care, Center for Animal Control 
Department of Internal Medicine, Division of Hypertension, Center for Animal Control" 

library(stringi) 
library(dplyr) 
library(tidyr) 

data_frame(text = text) %>% 
    mutate(line = text %>% stri_split_fixed("\n")) %>% 
    unnest(line) %>% 
    mutate(phrase = line %>% stri_split_fixed(", ")) %>% 
    unnest(phrase) %>% 
    count(phrase) 
1

Я использую scan и trimws для выполнения этих задач обработки текста.

inp <- " Center for Animal Control, Division of Hypertension, Department of Medicine 
    Department of Surgery, Division of Primary Care, Center for Animal Control 
    Department of Internal Medicine, Division of Hypertension, Center for Animal Control" 

> table(trimws(scan(text=inp, what="", sep=","))) 
Read 9 items 

     Center for Animal Control Department of Internal Medicine 
           3        1 
     Department of Medicine   Department of Surgery 
           1        1 
     Division of Hypertension  Division of Primary Care 
           2        1 

Можно также обернуть as.data.frame вокруг этого результата:

> as.data.frame(table( trimws(scan(text=inp, what="", sep=",")))) 
Read 9 items 
          Var1 Freq 
1  Center for Animal Control 3 
2 Department of Internal Medicine 1 
3   Department of Medicine 1 
4   Department of Surgery 1 
5  Division of Hypertension 2 
6  Division of Primary Care 1 
Смежные вопросы