-1

我有很大的 .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 的新表,行 t3 的新表等)。在这个例子中,我应该有 6 个新表。

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

如本例所示,t1 的新表将包含 t1,t2,t4,因为 f1 列中的值与 f1 中 t2 和 t4 行的值具有相同的值(即 1),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 个新表(当我使用原始数据时)。

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

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

感谢专家的帮助!

4

1 回答 1

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 的,我担心它可能是这样,请注意包含行名,但不会创建列标题来指定行名。

于 2012-09-17T23:02:28.553 回答