在R中从数据框的某一列中获取每一行的第一个字母。

4
我遇到了以下问题。给定一个数据框,其中包含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]“另一个第一个字母”,新行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"   

我已经谷歌搜索了很长时间,但到目前为止没有任何函数可用。

有什么建议吗?


请提供一个小的可重现的示例,以及您正在使用的代码。我怀疑您遇到了列表的问题。 - Roman Luštrik
那么问题到底是什么? - Chase
您的需求描述不够清晰,无法确定您的期望。 - IRTFM
1个回答

2

你可以使用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)

啊,对不起,我的意思是 substr(row.names(data),1,1)。很高兴你能找出缺失的部分! - crayola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接