-1

次のようなデータがあります。

A  B
1 10 
1 20
1 30
2 10
2 30
2 40
3 20
3 10
3 30
4 20
4 10
5 10
5 10

そして、次のような分割表を作成したいと思います。

   10 20 30 40
10 1   3  2  0
20 3   0  2  0
30 2   2  0  0
40 0   0  0  0

意味: 列 A に従って、列 B の各 2 つの値について、特定の分割表のマーク + 1。

これを行うのを手伝ってもらえますか?

4

1 に答える 1

0

私はすでにあなたの問題に多くの時間を費やしているので、画像からのデータを使用して、これは非常に醜い答えです。一般に、結果を変数の順序に依存させることは実用的ではありません。

A <- rep(c(1:4),c(3,2,3,3))
B <- c(10,10,30,10,20,30,20,10,10,20,30)
data <- data.frame(cbind(A,B))

#split by A
library(plyr)
data2 <- ddply(data,.(A),function(x){
  combined_pairs <- cbind(x$B[-nrow(x)],
                          x$B[-1])
  #return data where first is always lowest
  smallest <- apply(combined_pairs,MARGIN=1,
                    FUN=min)
  largest <- apply(combined_pairs,MARGIN=1,
                   FUN=max)
  return(data.frame(small=smallest,large=largest))
})


library(reshape2)

result <- dcast(small~large,data=data2, 
                fun.aggregate=length) 
> result
  small 10 20 30
1    10  1  3  1
2    20  0  0  2

まだ必要な場合は、空の行を自分で追加できると思います。

于 2015-07-20T19:26:16.607 に答える