我遇到以下问题。每个名称都有一个带有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**
我已经成功地使用“sort”功能按字母顺序排列了名称,这样,不仅名称列按字母顺序排列,而且属于每个名称的5个类别也随之移动。到目前为止,还算不错,但是任务是从每个名称中提取第一个字母,并仅选择其开头字母最常出现的那些名称。我可以使用“strsplit”功能获得首字母,然后首字母出现在每一行上,但它们的左侧到处都是[1]“第一字母”,新行[1]“另一个首字母”,新的row1 [...]直到第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)
谢谢,并感谢您的快速响应!!
编辑
我需要的是:
创建一个仅包含“行名”列中每个名称的第一个字母的 vector (或尺寸为[54,1]的矩阵),它的每一行应为数据中已排序 vector 的行号框,以便我们将位置保留在所示的数据框中。
例如
[1]"A"
[2]"B"
[3]"B"
[4]"C"
....
换句话说,必须提取仅具有行名的第一个字母的 vector /矩阵(在数据框“行名”中仅定义为画家名称,因此第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中是否有一个函数或命令现在可以接受这个“firSTLetter” [vector / matrix / list / data.frame]取决于我们如何定义其结构(最佳决定是什么?在这里?稍后使用)并检查在 vector /矩阵/列表中最常出现的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"
谷歌已经很久了,到目前为止,没有任何功能对我有用。
有什么建议么?

最佳答案

substr(row.names(data), 1, 1)不会让您看起来像是首字母的 vector 吗?

编辑:我最初错误地写了substr(row.names(data)),省略了索引。

对于问题的第二部分,假设firstletter是一个 vector :
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)

关于r - 从R的data.frame中某一列的每一行获取第一个字母,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5844791/

10-11 00:21
查看更多