我有很大的.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
我有一张桌子(如上所述)
我想要做的是,我想为每一行创建新表(意思是,我将为所有行创建新表。例如,行t1的新表,行t2的新表,new第t3行等表。在这个例子中,我应该有6个新表。
要为每一行开发新表,需要满足一个条件。新表应该查看每列中的每个值。如果列与另一行中的其他列具有相同的值(值为1),则应将其组合在一起。
如本示例所示,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
对于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
与其他行(行t3,t4,t5和t6)类似,它应该查看每列中的每个值。如果列与另一行中的其他列具有相同的值(值为1),则应将其组合在一起。
然后应将新表(包含行和列标题)保存在新的.csv文件中。应使用其行名重命名该文件。例如,对于t1,它应保存为t1.csv。
这只是一个简单的例子。此处提出的解决方案将应用于其他大数据表。我需要阅读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
感谢专家的帮助!
答案 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。