#r #extract #dataframe #rowname
#r #фрейм данных #извлечь #r-имена строк
Вопрос:
Я сталкиваюсь со следующей проблемой. Каждому выдается фрейм данных с 5 категориями — a, b, c, d, e для каждого имени (имен 54). Я привожу вам небольшую выдержку из всего фрейма данных в R, просто чтобы дать вам представление об этой теме.
**a b c d e
Teniers 15 12 13 6 G
Van Dyck 15 10 17 13 G
Bourdon 10 8 8 4 H
Le Brun 16 16 8 16 H
Le Suer 15 15 4 15 H
Poussin 15 17 6 15 H**
Мне удалось упорядочить имена в алфавитном порядке с помощью функции «сортировать», так что не только столбец имен упорядочен в алфавитном порядке, но и перемещены их 5 категорий, принадлежащих к каждому имени. Пока все идет хорошо, но задача состоит в том, чтобы взять первую букву из каждого имени и выбрать только те имена, начальные буквы которых появляются чаще всего. Я могу получить первые буквы с помощью функции «strsplit», затем первые буквы появляются в каждой строке, но слева от них везде остается [1] «первая буква», новая строка [1] «другая первая буква», новая строка 1[…] до 54-й; и не позиция в dataframe..
Итак, есть идеи?
Вот выдержка из кода…
library(MASS)
data(painters)
attach(painters)
painters
str(painters)
summary(painters)
y <- as.vector(rownames(painters))
is.vector(y)
sortnames <- painters[order(y) , ]
as.data.frame( painters[order(y) , ] ) ##sorted in list; each name with ist relevant criteria
rownames(sortnames)
z <- rownames(sortnames)
str(z)
is.vector(z)
strsplit(z, "")
as.list(strsplit(z, ""))
liste <- as.list(strsplit(z, ""))
matrix <- as.matrix(liste)
matrix
matrix[,1]
matrix[1,]
matrix[1,1]
matrix[[1]] [1]
first <- matrix (as.matrix(liste))
for(i in 1:54) {print( matrix[[i]][1]) }
str(first)
что мне нужно, так это:
чтобы создать вектор (или матрицу с размером [54,1]), который содержит только первую букву каждого имени в столбце «имена строк», каждая его строка должна быть номером строки из отсортированного вектора во фрейме данных, чтобы мы сохранили позицию в показанном фрейме данных.
например
[1]"A"
[2]"B"
[3]"B"
[4]"C"
....
Другими словами, нужно извлечь вектор / матрицу только с первой буквой rownames (во фрейме данных «имена строк» определяются только как имена художников, поэтому самый первый столбец из 6 ;))
Я ценю вашу помощь.
substr(data, 1, 1)
i got them like that:
firstletter <- substr(rownames(sortnames), 1, 1)
firstletter <- as.data.frame(firstletter) **##how should I define "firstletter" for later use??**
firstletter
1 A
2 B
3 B
4 B
5 B
6 C
7 C
8 C
9 D
10 D
11 D
12 D
13 D
14 D
15 D
16 F
17 F
18 F
19 G
20 G
21 G
22 H
23 J
24 J
25 L
26 L
27 L
28 L
29 M
30 M
31 O
32 P
33 P
34 P
35 P
36 P
37 P
38 P
39 P
40 P
41 R
42 R
43 R
44 T
45 T
46 T
47 T
48 T
49 T
50 V
51 V
52 V
53 V
54 V
сработало как по волшебству. извлекается первая буква имен художников, и номер строки остается таким, как и должен быть.
Итак, большое спасибо!
p.s. У меня есть только последний вопрос, есть ли функция или команда в R, которая теперь может принимать это «первое письмо» [вектор / матрица / список / data.frame], зависит от того, как мы определяем его структуру (какое лучшее решение? здесь для последующего использования) и проверьте, какие 3 наиболее часто появляющиеся первые буквы в векторе / матрице / списке, и извлеките только их? или это было бы слишком сложно?
РЕДАКТИРОВАТЬ: Все, что мне нужно, это просто удалить избыточную последнюю строку из определенной матрицы после вычитания (команда rbind)
firstletter Composition Drawing Colour Expression School
Da Udine "D" "10" " 8" "16" " 3" "A"
Del Piombo "D" " 8" "13" "16" " 7" "A"
Diepenbeck "D" "11" "10" "14" " 6" "G"
Palma Giovane "P" "12" " 9" "14" " 6" "D"
Palma Vecchio "P" " 5" " 6" "16" " 0" "D"
Pordenone "P" " 8" "14" "17" " 5" "D"
Teniers "T" "15" "12" "13" " 6" "G"
The Carraci "T" "15" "17" "13" "13" "E"
Tintoretto "T" "15" "14" "16" " 4" "D"
Titian "T" "12" "15" "18" " 6" "D"
Da Vinci "D" "15" "16" " 4" "14" "A"
Domenichino "D" "15" "17" " 9" "17" "E"
Poussin "P" "15" "17" " 6" "15" "H"
The Carraci1 "T" "15" "17" "13" "13" "E"
Долгое время гуглил, и до сих пор у меня не работала ни одна функция.
Есть предложения?
Комментарии:
1. Пожалуйста, сделайте небольшой воспроизводимый пример вместе с вашим кодом, который вы используете. Я подозреваю, что у вас возникли проблемы со списком.
2. итак, в чем именно заключается вопрос?
3. Ваше описание того, что вы хотите, недостаточно ясно, чтобы определить, чего вы ожидаете.
Ответ №1:
substr(row.names(data), 1, 1)
Не получите ли вы вектор первых букв, которые, как вам кажется, нужны?
РЕДАКТИРОВАТЬ: я изначально неправильно написал substr(row.names(data))
, опустив индексы.
Что касается второй части вашего вопроса, предполагая, что firstletter
является вектором:
table(firstletter)
выдает таблицу частот первых букв. Таким образом, небольшая манипуляция позволяет получить то, что вы хотите, например:
names(sort(table(firstletter), decreasing=TRUE)[1:3])
Помогает ли это?
Теперь вы можете захотеть сделать что-то вроде: сохранить из исходного набора данных только строки, соответствующие этим трем наиболее часто встречающимся буквам. Одним из способов сделать это было бы:
top3letters <- names(sort(table(vec), decreasing=TRUE)[1:3])
data <- subset(data, firstletter %in% top3letters)
Комментарии:
1. Ах да, извините, я имел в виду
substr(row.names(data),1,1)
. Рад, что вы смогли вычислить недостающие биты!