3

次の問題が発生します。1つには、名前ごとにa、b、c、d、eの5つのカテゴリを持つデータフレームが与えられます(名前は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) 

よろしくお願いいたします。

編集

私が必要なのは:

「rownames」列の各名前の最初の文字のみを含むベクトル(またはdimension [54,1]の行列)を作成するには、その各行は、データ内の並べ替えられたベクトルの行番号である必要があります。フレーム。表示されているデータフレーム内の位置を維持します。

例えば

[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最後の質問だけですが、この「最初の文字」[vector / matrix / list / data.frame]を取得できる関数またはコマンドは、その構造をどのように定義するかによって異なります(ここでの最良の決定は何ですか?)後で使用するために)そして、vector / matrix / listで最も頻繁に現れる3つの最初の文字をチェックし、それらだけを抽出しますか?またはそれは複雑すぎるでしょうか?

編集:必要なのは、substract(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"   

長い間グーグルしてきましたが、今まで機能がありませんでした。

助言がありますか?

4

1 に答える 1

2

substr(row.names(data), 1, 1)あなたが探していると思われる最初の文字のベクトルを取得しませんか?

substr(row.names(data))EDIT:私は最初にインデックスを省略して間違って書いた.

firstletter質問の 2 番目の部分では、 がベクトルであると仮定します。

table(firstletter)最初の文字の頻度表を提供します。したがって、少し操作すると、必要なものが得られます。たとえば、次のようになります。

names(sort(table(firstletter), decreasing=TRUE)[1:3])

これは役に立ちますか?ここで、これらの最も頻繁に使用される 3 つの文字に対応する行のみを元のデータセットから保持するなどの操作を行うことができます。これを行う1つの方法は次のとおりです。

top3letters <- names(sort(table(vec), decreasing=TRUE)[1:3])
data <- subset(data, firstletter %in% top3letters)
于 2011-05-01T08:20:23.647 に答える