从大的.csv表创建新表

时间:2012-09-17 05:19:32

标签: r

我有很大的.csv文件。我想将该文件过滤到新表中。

例如,我有.csv文件,如下所示:

   f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
t1  1  0  1   0  1  0   0  0   0    1 
t2  1  0  0   0  0  1   1  1   1    1 
t3  0  0  0   0  0  0   0  0   0    0 
t4  1  0  0   0  1  0   0  0   0    0 
t5  0  0  0   0  0  0   0  0   0    0 
t6  0  0  0   0  0  0   0  0   0    0 
  1. 我有一张桌子(如上所述)

  2. 我想要做的是,我想为每一行创建新表(意思是,我将为所有行创建新表。例如,行t1的新表,行t2的新表,new第t3行等表。在这个例子中,我应该有6个新表。

  3. 要为每一行开发新表,需要满足一个条件。新表应该查看每列中的每个值。如果列与另一行中的其他列具有相同的值(值为1),则应将其组合在一起。

  4. 如本示例所示,t1的新表将包含t1,t2,t4,因为列f1中的值具有相同的值(即1),其中f1中的值为行t2和t4,f5中的值也相等对于行t4,f5中的值,f11中的值等于行t2中f11中的值。所以,这意味着,它将检查每一列。其中一个输出应该是这样的:

           f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
        t1  1  0  1   0  1  0   0  0   0    1 
        t2  1  0  0   0  0  1   1  1   1    1 
        t4  1  0  0   0  1  0   0  0   0    0 
    
    1. 对于t2,行t2应与t4分组,因为t1中的f1和t4中的值f1的值相等。但是,t2不应该考虑前一行(如本例所示,它不应该考虑t1)。输出应该是这样的:

        f1 f2  f3 f4  f5  f6 f7 f9  f10  f11 
      t2  1  0  0   0  0  1   1  1   1    1 
      t4  1  0  0   0  1  0   0  0   0    0 
      
    2. 与其他行(行t3,t4,t5和t6)类似,它应该查看每列中的每个值。如果列与另一行中的其他列具有相同的值(值为1),则应将其组合在一起。

    3. 然后应将新表(包含行和列标题)保存在新的.csv文件中。应使用其行名重命名该文件。例如,对于t1,它应保存为t1.csv。

    4. 这只是一个简单的例子。此处提出的解决方案将应用于其他大数据表。我需要阅读abc.csv文件。这意味着,它可能会创建超过100个新表(当我使用原始数据时)。

    5. 到目前为止我使用了这段代码:

      a.files <- grep("^Task_vs_Files", dir(), value=TRUE) 
      a.files
      
      for(i in 1:length(a.files))
         dat <- read.table(file=a.files[i], header=T, sep=",", row.names=1) 
      
      
            (sapply(1:nrow(dat), function(x) if (dat[x,]==1)  #check row
                  (sapply(1:nrow(dat), function(y) if (dat[,y]==1) #check column
      
                  { 
                         write.csv( dat[(dat[[x,y]]==1 ) & (1:nrow(dat) >= x) , ] , file = paste("Files_", x) ) #save file based on row names
                  } 
                  else {NULL} ))
      

      从a.files输出:

      [1] "Task_vs_Files_Proj.csv"  "Task_vs_Files_Whirr.csv"
      

      来自其中一个文件(Task_vs_Files_Proj.csv)的数据集

             pom.xml. ZooKeeper.java HBase.java Hadoop.java. BasicServer.java. Abstract.java. HBaseRegion.java
      WHIRR-25        1              0          1            0                 1              1                1
      WHIRR-28        1              0          1            0                 0              1                0
      WHIRR-55        0              0          1            0                 0              0                0
      WHIRR-61        0              0          0            0                 0              1                0
      WHIRR-76        0              0          1            0                 0              0                0
      WHIRR-87        1              1          1            0                 0              1                1
      WHIRR-92        1              0          0            1                 0              1                1
      

      感谢专家的帮助!

1 个答案:

答案 0 :(得分:1)

 sapply(1:nrow(dat), function(x) if (dat[x, "f1"]==1) { 
           write.csv( dat[ (dat[["f1"]]==1 )& (1:nrow(dat) >= x) , ])
            } else {NULL} )
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t1",1,0,1,0,1,0,0,0,0,1
"t2",1,0,0,0,0,1,1,1,1,1
"t4",1,0,0,0,1,0,0,0,0,0
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t2",1,0,0,0,0,1,1,1,1,1
"t4",1,0,0,0,1,0,0,0,0,0
"","f1","f2","f3","f4","f5","f6","f7","f9","f10","f11"
"t4",1,0,0,0,1,0,0,0,0,0
[[1]]
NULL

需要构建文件名:

invisible(
  sapply(1:nrow(dat), function(x) if (dat[x, "f1"]==1) { 
           write.csv( dat[ (dat[["f1"]]==1 )& (1:nrow(dat) >= x) , ] ,
                    file = paste0("fil_", x, ".csv") )
                                } else {NULL} )
         )   

如果这是针对Excel的,我担心它可能是,请注意包含rownames但不会创建列标题来指定rownames。

相关问题