2012-12-21 48 views
1

我有一个数据文件:匹配的一列到另一数字顺序中的R

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

读取文件:

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

示例[1]包含数字的数字顺序增加的列表。 示例[2]包含另一组数字

首先我想例如在识别号码[2]的关联例子中没有列出的[1]

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

现在我知道这些值我想将它们插入到示例[,1]中,使示例[,1]和示例[,2]中的现有值保持不变。

一个简短的例子是:

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

后,我跑setdiff()我得到的号码不是在第一列,但在第二位。现在

我想将它们例如[,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部分通过Joris Meys出色地解决!

我有两个进一步的问题:

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

1:

能同做,如果有一个附加的第三列,但我并不想用它做什么?

例如:

原始

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:

代替实施例中加入NA [2]用于以下情况为例[, 1]没有来自example [,2]的值,例如[,1]没有数字'30',那么我想海例如[,2]是否具有数字'30',并查看示例[,1]在该行中具有的值,然后将其添加到示例[,2]而不是NA中。

例如:

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 

回答

1

如果您的矩阵有两列以上,以下方法也适用。这是Joris Meys解决方案的延伸。

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 

一旦你创建了这个矩阵,很容易产生不来港一个新问题:

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 
+0

这将改变原始数据,请参阅上文。基本上,如果我运行这个命令,一些现有的数据将被销毁。 – user1723765

+0

基本上问题只是第二部分而不是匹配是否有一些其他的命令不会摆脱其他部分的数据? – user1723765

+0

@ user1723765查看我答案的更新。 –

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

+0

并做了类似的应用,如果我试图用矢量做到这一点s的不同长度? – user1723765

+0

我很清楚自己在问什么,或者我应该做些什么来使其更清楚?如果这令人困惑,我很抱歉。 – user1723765

+0

您改变了问题。不能在矩阵中组合两个不同长度的向量,就像在原始问题中那样。重新考虑你想要做什么(你是否有矩阵?你想添加哪些值?),给出输入,输出预期结果,然后返回给我们。如果你继续改变这个问题,这是不可能回答的。 –

相关问题