Tworzenie nowej tabeli z dużej tabeli .csv
Mam duży plik .csv. Chciałbym filtrować ten plik do nowej tabeli.
Na przykład mam plik .csv jak poniżej:
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
Mam stolik (jak wyżej)
Co chcę zrobić, chcę mieć nową tabelę dla każdego wiersza (co oznacza, że będę miał nową tabelę dla wszystkich wierszy. Np. Nowa tabela dla wiersza t1, nowa tabela dla wiersza t2, nowa tabela dla wiersza t3 itd.) ). Tak jak w tym przykładzie, powinienem mieć 6 nowych tabel.
Aby opracować nową tabelę dla każdego wiersza, istnieje warunek, który należy spełnić. Nowa tabela powinna sprawdzać każdą wartość w każdej kolumnie. A jeśli kolumna ma tę samą wartość z inną kolumną w innym wierszu (która jest wartością 1), powinna być zgrupowana razem.
Tak jak w tym przykładzie, nowa tabela dla t1 będzie składać się z t1, t2, t4, ponieważ wartość w kolumnie f1 ma tę samą wartość (która wynosi 1) z wartością w f1 dla rzędu t2 i t4, również wartość w f5 jest równa wartości w f5 dla wiersza t4, a wartość w f11 jest równa wartości w f11 dla wiersza t2). Oznacza to, że sprawdzi każdą kolumnę. Jedno z wyników dla powinno być następujące:
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
Podobnie jak w przypadku t2, wiersz t2 należy zgrupować z t4, ponieważ wartość w f1 w t1 i wartość f1 w t4 są równe. Jednak t2 nie powinien brać pod uwagę wcześniejszego wiersza (jak w tym przykładzie, nie powinien brać pod uwagę t1). Dane wyjściowe powinny wyglądać następująco:
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
Podobnie jak w innych wierszach (wiersz t3, t4, t5 i t6), powinien sprawdzać każdą wartość w każdej kolumnie. A jeśli kolumna ma tę samą wartość z inną kolumną w innym wierszu (która jest wartością 1), powinna być zgrupowana razem.
Nowa tabela (z nagłówkiem wiersza i kolumny) powinna być następnie zapisana w nowym pliku .csv. Nazwa pliku powinna zostać zmieniona przy użyciu nazwy wiersza. na przykład, jak dla t1, powinien być zapisany jako t1.csv.
To tylko prosty przykład. Proponowane rozwiązanie zostanie zastosowane w innych dużych tabelach danych. Muszę przeczytać plik abc.csv. Oznacza to, że może być więcej niż 100+ zostanie utworzona nowa tabela (gdy użyłem oryginalnych danych).
do tej pory użyłem tego kodu:
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} ))
wyjście z a.files:
[1] "Task_vs_Files_Proj.csv" "Task_vs_Files_Whirr.csv"
zbiór danych z jednego pliku (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
Doceń pomoc eksperta!