1

私はデータファイルを持っています:

https://dl.dropbox.com/u/22681355/example.csv

ファイルの読み取り:

example<-read.csv("example.csv")
example<-example[,-1]

example [、1]には、番号順に増加する番号のリストが含まれています。example [、2]には別の数字のセットが含まれています

まず、example [、1]にリストされていないexample [、2]の番号を特定したいと思います。

diff<-setdiff(example[,2],example[,1])

これらの値がわかったので、example [、1]に挿入し、example [、1]とexample [、2]の既存の値をそのまま残します。

簡単な例は次のとおりです。

Example[,1]   Example[,2]
1             1000
1             50
1             3
1             90
1             25
3             4
5             2
5             7
etc           etc

setdiff()を実行した後、最初の列ではなく2番目の列に数値が表示されます。

次に、それらをexample [、1]に配置して、次の出力を生成します。

Example[,1]   Example[,2]
1             1000
1             50
1             3
1             90
1             25
2             NA
3             4
4             NA
5             2
5             7
etc           etc

したがって、基本的には番号順に配置しますが、他のすべてはそのままにします。

パート1はJorisMeysによって見事に解決されました!

さらに2つの質問があります。

////////////////////////////////////////////////// ///////////////////////////////////////

1:

追加の3番目の列があるが、それで何もしたくない場合も同じことができますか?

例えば:

オリジナル

 Example[,1]   Example[,2] Example[,3]
 1             1000        37
 1             50          18
 1             3           54
 1             90          72
 1             25          23
 3             4           15
 5             2           20
 5             7           9
 etc           etc

必要な出力:

Example[,1]   Example[,2]  Example[,3]
1             1000         37
1             50           18
1             3            54
1             90           72
1             25           23
2             NA           NA
3             4            15
4             NA           NA
5             2            20
5             7            19
etc           etc

2:

example [、1]にexample [、2]の値がない場合に、example [、2]にNAを追加する代わりに、たとえばexample [、1]に番号「30」がない場合は、検索します。 example [、2]の番号が「30」であるかどうかを確認し、example [、1]がその行にどのような値を持っているかを確認してから、NAの代わりにexample [、2]に追加します。

例えば:

Example[,1]   Example[,2]  Example[,3]
1             1000         37
1             50           18
1             3            54
1             90           72
1             25           23
2             NA           NA
3             4            15
4             NA           NA
5             2            20
5             7            19
etc           etc

NAの代わりに:

Example[,1]   Example[,2]  Example[,3]
1             1000         37
1             50           18
1             3            54
1             90           72
1             25           23
2            5            20
3             4            15
4            3           15
5             2            20
5             7            19
etc           etc
4

2 に答える 2

3

だから、あなたが欲しいものを明確にした後、これはあなたがマトリックスを持っていることを意味します

Example <- 
matrix(
  c(1,1,1,1,1,3,5,5,1000,50,3,90,25,4,2,7),
  ncol=2
)

次に、次のことを行うことができます。

diffs <- setdiff(Example[,2],Example[,1])
tmps <- rbind(Example,
              matrix(
                 c(diffs,rep(NA,length(diffs))),
                 ncol=2
              )
        )
solution <- tmps[order(tmps[,1]),]

これにより、次の結果が得られます。

> solution
      [,1] [,2]
 [1,]    1 1000
 [2,]    1   50
 [3,]    1    3
 [4,]    1   90
 [5,]    1   25
 [6,]    2   NA
 [7,]    3    4
 [8,]    4   NA
 [9,]    5    2
[10,]    5    7
[11,]    7   NA
...

ヘルプファイル?matrixとを参照してください?order

于 2012-12-21T13:41:09.713 に答える
1

次のアプローチは、マトリックスに3つ以上の列がある場合にも機能します。これは、JorisMeysのソリューションの拡張です。

Example <- matrix(c(1,1,1,1,1,3,5,5,
                    1000,50,3,90,25,4,2,7,37,18,54,72,23,15,20,9),ncol=3)


diffs <- setdiff(Example[,2], Example[,1])
new_mat <- rbind(Example,
                 matrix(c(diffs,
                          rep(NA, length(diffs) * (ncol(Example) - 1))), 
                        ncol = ncol(Example)))
solution <- new_mat[order(new_mat[,1]),]

結果:

      [,1] [,2] [,3]
 [1,]    1 1000   37
 [2,]    1   50   18
 [3,]    1    3   54
 [4,]    1   90   72
 [5,]    1   25   23
 [6,]    2   NA   NA
 [7,]    3    4   15
 [8,]    4   NA   NA
 [9,]    5    2   20
[10,]    5    7    9
[11,]    7   NA   NA
[12,]   25   NA   NA
[13,]   50   NA   NA
[14,]   90   NA   NA
[15,] 1000   NA   NA

このマトリックスを作成したら、NAなしで新しいマトリックスを簡単に生成できます。

solution2 <- solution
solution2[is.na(solution2)] <- Example[match(sort(diffs), Example[,2]), -2]

結果:

      [,1] [,2] [,3]
 [1,]    1 1000   37
 [2,]    1   50   18
 [3,]    1    3   54
 [4,]    1   90   72
 [5,]    1   25   23
 [6,]    2    5   20
 [7,]    3    4   15
 [8,]    4    3   15
 [9,]    5    2   20
[10,]    5    7    9
[11,]    7    5    9
[12,]   25    1   23
[13,]   50    1   18
[14,]   90    1   72
[15,] 1000    1   37
于 2012-12-21T14:19:05.467 に答える