0

いくつかの回答を検索しましたが、私の質問に答えられるものはないようです

私はこのようなデータを持っています (2 列、2 つのグループ group"1" と group"2")

  • 1 10
  • 1 20
  • 1 50
  • 2 40
  • 2 30
  • 2 60

そして、各グループごとに列から行に転置したい結果は次のようになります

  • 1 1 1
  • 10 20 50
  • 2 2 2
  • 40 30 60

私はたくさんのグループを持っているので、手動で 1 つずつ行うことはできません。誰でも私を助けてもらえますか?ありがとうございました。

みんなありがとう、すべてのグループは同じ長さなので (Floris からのコメントに触発されて)、実際には行列を使用して問題を解決できます。

    x=read.table(header=F,text="10 20 50 40 30 60")
    matrix(x,nrow=2,byrow=T)
4

3 に答える 3

4
x <- read.table(header=F, text="1 10
1 20
1 50
2 40
2 30
2 60")

do.call(rbind, by(x, x$V1, FUN=t))
##     1  2  3
## V1  1  1  1
## V2 10 20 50
## V1  2  2  2
## V2 40 30 60
于 2013-02-17T01:58:13.850 に答える
1

VBA の使い方を知っていれば、これを行う短い sub() を書くのは簡単です。私はアドレスをハードコーディングしています - あなたはそれを移動する方法を理解することができます. このマクロを呼び出すときにデータがアクティブなシートにあり、コピーを元のシートの右側に表示することを想定しています (列 A と B にあり、行 2 から始まる - 上のラベル用のスペースを確保します)。 )。また、グループには 1、2、3 の番号が付けられており、それらの値をコピーする必要はないと仮定します。コードは次のようになります (F-11 を押して VBA エディターを開き、モジュールを挿入して、これをコピーします)。

Sub bigSwap()
dim R as Range, c as Range
dim grp
dim grpCount(1 To 100) ' assuming no more than 100 groups, or adjust this number
dim i

' just making sure it's properly initialized
for i=1 To 100
  grpCount(ii)=0
next i


Set R = Range("B2", [B2].End(xlDown)) ' this finds all the cells with values
' note - I am using [B2] as shorthand for Range("B2")

For each c in R.cells
  grp = c.offset(0, -1).value  ' find the corresponding group
  [D1].offset(grp, grpCount(grp)).value = c.value
  grpCount(grp) = grpCount(grp)+1  ' keep track of # in this row
next

End Sub

これをテストすることはできませんでしたが、良いと思います。問題が発生した場合は、コメントを残してください。

于 2013-02-17T02:03:19.857 に答える