我有很大的 .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 的新表,行 t3 的新表等)。在这个例子中,我应该有 6 个新表。
要为每一行开发新表,需要满足一个条件。新表应查看每列中的每个值。如果该列与其他行中的其他列具有相同的值(即值为 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
至于 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
感谢专家的帮助!