22

一意の行名と一意の列名を持つデータフレームがあります。行を列に、列を行に変換したい。

たとえば、次のコード:

starting_df <- data.frame(row.names= c(LETTERS[1:4]),
                          a = c(1:4),
                          b = seq(0.02,0.08,by=0.02),
                          c = c("Aaaa","Bbbb","Cccc","Dddd")
                )

結果は次のとおりです。

> starting_df
  a    b    c
A 1 0.02 Aaaa
B 2 0.04 Bbbb
C 3 0.06 Cccc
D 4 0.08 Dddd

以前は行だったものが列になったことを除いて、まったく同じデータを含む別のデータフレームに変換したいと思います。

> final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd
4

2 に答える 2

47

でラップされた基本転置関数を使用するだけです。tas.data.frame

final_df <- as.data.frame(t(starting_df))
final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd

以上更新しました。docendo discimus が指摘したようにt、行列を返します。マークが提案したように、それをラップするとas.data.frame、マトリックスではなくデータフレームが返されます。ありがとう!

于 2015-02-23T18:42:04.783 に答える
3

以下はtidyverse、データに応じて機能する可能性のあるオプションと、その使用に関するいくつかの注意事項です。

library(tidyverse)

starting_df %>% 
  rownames_to_column() %>% 
  gather(variable, value, -rowname) %>% 
  spread(rowname, value)

rownames_to_column()元のデータフレームに意味のある行名がある場合は必要です。そうでない場合、新しい転置されたデータフレームの新しい列名は、元の行番号に対応する整数になります。意味のある行名がない場合は、それらの値が一意で意味があると仮定して、スキップしてデータフレームの最初の列の名前にrownames_to_column()置き換えることができます。サンプル データrownameを使用すると、次のようになります。tidyr::smiths

smiths %>% 
    gather(variable, value, -subject) %>% 
    spread(subject, value)

アプローチで例starting_dfを使用すると、tidyverse属性の削除に関する警告メッセージがスローされます。これは、異なる属性タイプの列を単一の文字列に変換することに関連しています。を除くすべての列が double であるため、smithsデータはその警告を表示しません。subject

前の回答を使用すると、が追加されas.data.frame(t())ない限り、列の種類が混在している場合はすべてが係数に変換されますが、列の種類が混在している場合、オプションはデフォルトですべてを文字に変換します。stringsAsFactors = FALSEtidyverse

于 2020-02-16T17:12:50.177 に答える