Р: объединение частотных списков разной длины по меткам? - PullRequest
4 голосов
/ 12 января 2012

Я новичок в R, но очень нравится и хочу постоянно совершенствоваться. Теперь, после поисков, мне нужно попросить вас о помощи.

Это данный случай:

1) У меня есть предложения (предложение 1 и предложение 2 - все слова уже в нижнем регистре), и я создаю отсортированные списки частот их слов:

sentence.1 <- "bob buys this car, although his old car is still fine." # saves the sentence into sentence.1
sentence.2 <- "a car can cost you very much per month."

sentence.1.list <- strsplit(sentence.1, "\\W+", perl=T) #(I have these following commands thanks to Stefan Gries) we split the sentence at non-word characters
sentence.2.list <- strsplit(sentence.2, "\\W+", perl=T)

sentence.1.vector <- unlist(sentence.1.list) # then we create a vector of the list
sentence.2.vector <- unlist(sentence.2.list) # vectorizes the list

sentence.1.freq <- table(sentence.1.vector) # and finally create the frequency lists for 
sentence.2.freq <- table(sentence.2.vector)

Вот результаты:

sentence.1.freq:
although      bob     buys      car     fine      his       is      old    still     this 
       1        1        1        2        1        1        1        1        1        1

sentence.2.freq:
a   can   car  cost month  much   per  very   you 
1     1     1     1     1     1     1     1     1 

Теперь, пожалуйста, как бы я мог объединить эти два списка частот, у меня будет следующее:

 a  although  bob  buys  can  car  cost fine his  is  month much old per still this very you
NA         1    1     1   NA    2    NA    1   1   1     NA   NA   1  NA     1    1   NA  NA
 1        NA   NA    NA    1    1     1   NA  NA  NA      1    1  NA   1    NA   NA    1   1

Таким образом, эта «таблица» должна быть «гибкой», чтобы в случае ввода нового предложения со словом, например, «и», таблица добавит столбец с меткой «и» между «а» и «хотя».

Я подумал о том, чтобы просто добавить новые предложения в новую строку и поместить все не слова, которых еще нет в списке, по столбцам (здесь «и» будут справа от «вас») и снова отсортировать список , Однако я не справился с этим, поскольку сортировка частот слов нового предложения по существующим ярлыкам уже не работала (когда, например, снова появляется слово «машина», частоту нового слова в предложении следует записать в строка нового предложения и столбец «car», но когда в первый раз, например, «вы», его частота должна быть записана в строку нового предложения и новый столбец с надписью «вы»).

1 Ответ

3 голосов
/ 12 января 2012

Это не точно то, что вы описываете, но то, к чему вы стремитесь, имеет больше смысла для меня, организованной по строке, а не по столбцу (а R обрабатывает данные, организованные таким образом, немного легчев любом случае).

#Convert tables to data frames
a1 <- as.data.frame(sentence.1.freq)
a2 <- as.data.frame(sentence.2.freq)

#There are other options here, see note below
colnames(a1) <- colnames(a2) <- c('word','freq')
#Then merge
merge(a1,a2,by = "word",all = TRUE)
       word freq.x freq.y
1  although      1     NA
2       bob      1     NA
3      buys      1     NA
4       car      2      1
5      fine      1     NA
6       his      1     NA
7        is      1     NA
8       old      1     NA
9     still      1     NA
10     this      1     NA
11        a     NA      1
12      can     NA      1
13     cost     NA      1
14    month     NA      1
15     much     NA      1
16      per     NA      1
17     very     NA      1
18      you     NA      1

Затем вы можете продолжать использовать merge, чтобы добавить больше предложений.Я преобразовал имена столбцов для простоты, но есть и другие варианты.Использование аргументов by.x и by.y вместо by в merge может указывать на объединение определенных столбцов, если имена не совпадают в каждом фрейме данных.Кроме того, аргумент suffix в merge будет управлять тем, как столбцам счетчика присваиваются уникальные имена.По умолчанию добавляются .x и .y, но вы можете изменить это.

...