Получение первой буквы из каждой строки определенного столбца в data.frame в R - PullRequest
3 голосов
/ 01 мая 2011

У меня возникла следующая проблема.Каждому дается кадр данных с 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-го;а не позиция в кадре данных ..

Итак, есть идеи?

Вот выдержка из кода ...

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]), которая содержит толькопервая буква каждого имени в столбце «rownames», каждая строка должна быть номером строки из отсортированного вектора во фрейме данных, чтобы мы сохранили позицию в показанном фрейме данных.

например

[1]"A"
[2]"B"
[3]"B"
[4]"C"
....

Другими словами, нужно извлечь вектор / матрицу только с первой буквой имени строки (в кадре данных "имена строк" определяются только как имена художников, поэтому самый первый столбец6;))

Я ценю вашу помощь.

substr(data, 1, 1)

я получил их вот так:

 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

работал как шарм.извлекается первая буква имен художников, и номер строки остается на своем месте.

Итак, большое спасибо!

ps У меня есть только последний вопрос, есть ли функция илиКоманда в R, которая может теперь взять эту «первую букву» [vector / matrix / list / 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 голосов
/ 01 мая 2011

Не 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)
...