Изменение длины слова во фрейме данных - PullRequest
1 голос
/ 20 июня 2020

Я печатаю фрейм данных, в котором должно быть указано слово, длина и частота в любом простом текстовом документе. У меня все настроено, но 1) длина не учитывает количество символов, я не уверен, что он на самом деле считает; и 2) Мне нужно реорганизовать список слов с самого длинного слова на самое короткое для окончательной печати списка.

file <- c(scan("a.txt",character()))
file <- as.data.frame(table(file))

Freq <- file$Freq
Word <- file$file
Len <- sapply(c(Word),nchar)

Файл плоскости a.txt со следующим:

the the the bus ran over two two people and when

печатает

Word Len Freq
1    and   1    1
2    bus   1    1
3   over   1    1
4 people   1    1
5    ran   1    1
6    the   1    3
7    two   1    2
8   when   1    1

Len должно быть длиной букв, но здесь он всегда считается 1 - в более длительных тестах он иногда говорит 2, поэтому я не уверен, что он считает. После этого он печатает:

[1] and    bus    over   people ran    the    two    when  
Levels: and bus over people ran the two when

Я пытаюсь получить полную печать слова в порядке от самого длинного к самому короткому. Я мог бы использовать Len для сортировки слов, но я не могу заставить sapply работать правильно.

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Вы можете попытаться преобразовать file$file (который здесь является фактором) в строку, используя as.character(), и подсчитать ее символы с помощью простого nchar() без sapply(), поскольку R векторизуется.

file <- c(scan("a.txt",character()))
file <- as.data.frame(table(file))

Freq <- file$Freq
Word <- as.character(file$file)

Len <- nchar(Word)

x <- data.frame(Word, Len, Freq)
print(x)
print(Word[order(Len, decreasing = T)])

Заказ осуществляется с помощью order().

Результаты:

print(x)
#     Word Len Freq
# 1    and   3    1
# 2    bus   3    1
# 3   over   4    1
# 4 people   6    1
# 5    ran   3    1
# 6    the   3    3
# 7    two   3    2
# 8   when   4    1

print(Word[order(Len, decreasing = T)])
# [1] "people" "over"   "when"   "and"    "bus"    "ran"    "the"    "two"
1 голос
/ 20 июня 2020

С текстом, созданным Lorem Ipsum , эта последовательность инструкций выполняет то, что требует вопрос.

Word <- scan(file = 'a.txt', what = character())

Word <- gsub('[[:punct:]]', '', Word)    # remove punctuation characters
Word <- tolower(Word)                    # all characters lower case
tbl <- table(Word)                       # now get their frequencies
Len <- nchar(names(tbl))                 # the words are the table's names
x <- as.data.frame(tbl)                  # to data.frame
x$Len <- Len                             # assign the lengths column

Теперь данные расположены в лексикографическом порядке c. Если класс x$Word равен "factor", используйте аргумент stringsAsFactors = FALSE в вызове as.data.frame.

Наконец, отсортируйте по Len и назначьте новые номера строк.

x <- x[order(x$Len, decreasing = TRUE), ]
row.names(x) <- NULL
head(x)
#          Word Freq Len
#1 sollicitudin    3  12
#2 pellentesque    4  12
#3  ullamcorper    5  11
#4  suspendisse    1  11
#5  scelerisque    2  11
#6  consectetur    2  11
0 голосов
/ 20 июня 2020

length () вычисляет длину вектора. Например:

x <- c("apple", "pie", "math", "this is sentance")
x
[1] "apple"            "pie"              "math"             "this is sentance"
length(x)
[1] 4

x - вектор символов длиной 4 (он имеет 4 элемента). Если вы хотите рассчитать количество символов для каждого элемента в векторе символов, используйте nchar ():

nchar(x)
[1]  5  3  4 16

, как вы можете видеть, nchar () векторизован - он вычисляет количество символов (не только букв) для каждого элемент в векторе символов.

0 голосов
/ 20 июня 2020

У меня нет ваших данных, но вы могли бы сделать что-то вроде этого. $ выполняет извлечение данных по имени, поэтому file$Freq получает столбец Freq из data.frame file.

file$Len <- nchar(file$file)

x <- file[,c('file', 'Len', 'Freq')]
names(x) <- c('Word', 'Len', 'Freq')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...