我遇到了以下问题。给定一个数据框,其中包含5个类别-a、b、c、d、e,以及每个名称(共有54个名称)。
我在这里提供 R 中整个数据框的一个小片段,只是让您对主题有所了解。
我需要的是:
创建一个向量(或一个维度为[54,1]的矩阵),其中包含“rownames”列中每个名称的第一个字母,它的每一行应该是数据框中排序后向量的行号,以便我们保留在数据框中显示的位置。
例如:
换句话说,需要��取一个只包含行名第一个字母的向量/矩阵(在数据框中,“rownames”仅定义为画家的名称,因此是6列中的第一列;))
感谢您的帮助。
**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]“另一个第一个字母”,新行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"
....
换句话说,需要��取一个只包含行名第一个字母的向量/矩阵(在数据框中,“rownames”仅定义为画家的名称,因此是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
像魔法一样运作。画家名字的第一个字母被提取出来,行号保持不变。
所以,非常感谢!
p.s. 我只有一个最后的问题,R 中是否有一个函数或命令,现在可以将此“firstletter”[向量/矩阵/列表/数据框](取决于我们如何定义它的结构[什么是最佳决策?这里供以后使用]),并检查向量/矩阵/列表中出现最多的前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"
我已经谷歌搜索了很长时间,但到目前为止没有任何函数可用。
有什么建议吗?