Получение первой буквы из каждой строки определенного столбца в data.frame в R

#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) . Рад, что вы смогли вычислить недостающие биты!