2015-10-02 2 views
1

У меня есть большой набор данных, и я использовал splitting, чтобы сделать данные более доступными. Я закончил с ~ 250 расколов. В результате каждый раскол имеет различное количество столбцов, которые пусты. Я хочу удалить пустые столбцы и записать обновленные файлы. Я могу сделать это вручную, но, как я уже упоминал, у меня примерно 250 расколов, поэтому я не могу сделать это для всех.Удаление столбцов NA в нескольких файлах в r

Ниже воспроизводимый пример:

df <- data.frame(Size= c(800, 850, 1100, 1200, 1000), 
       Value= c(900, NA, 1300, 1100, NA), 
       Location= c(NA, 'midcity', 'uptown', NA, 'Lakeview'), 
       Num1 = c(2, NA, 3, 2, NA), 
       Num2 = c(2,3,3,1,2), 
       Rent= c('y', 'y', 'n', 'y', 'n')) 

Это то, что я до сих пор.

Расщепление:

index <- apply(is.na(df)*1, 1,paste, collapse = "") 
s <- split(df, index) 
split(df, index) 
for (i in 1:length(s)) 
{write.csv(s[i], file = paste0("Splits/", i, "splits.csv"), row.names=FALSE, na = "")} 

Удаление пустых столбцов:

split <- read.csv("Splits/3splits.csv") 
updated_split <- split[,colSums(is.na(split))<nrow(split)] 
write.csv(updated_split, file = "updated_3split.csv", row.names=FALSE) 

split <- read.csv("Splits/2splits.csv") 
updated_split <- split[,colSums(is.na(split))<nrow(split)] 
write.csv(updated_split, file = "updated_2split.csv", row.names=FALSE) 

split <- read.csv("Splits/1splits.csv") 
updated_split <- split[,colSums(is.na(split))<nrow(split)] 
write.csv(updated_split, file = "updated_1split.csv", row.names=FALSE) 

Есть ли способ автоматизировать процесс выше? То, что я подразумеваю под автоматикой, заключается в том, чтобы найти способ удалить пустые столбцы в этих трех файлах, не повторяя одни и те же три строки снова и снова (делать это с 250 файлами на самом деле не вариант).

Редакция 1:

Нравится?

for (i in 1:length(s)) 
{ 
lapply(s, function(x) x[,colSums(is.na(x))<nrow(x)]) 
write.csv(s[i], file = paste0("Splits/", i, "splits.csv"), row.names=FALSE, na = "") 
} 
+0

Мм, написать функцию, чтобы сделать сделать все три-четыре шага за один раз? Я действительно не уверен, что вы подразумеваете под автоматикой. –

+0

@MikeWise Добавлено объяснение. – Nik

+1

вы можете использовать lapply перед записью файлов. 'lapply (s, function (x) x [, colSums (is.na (x)) Jimbou

ответ

2

Может быть, это:

df <- data.frame(Size= c(800, 850, 1100, 1200, 1000), 
       Value= c(900, NA, 1300, 1100, NA), 
       Location= c(NA, 'midcity', 'uptown', NA, 'Lakeview'), 
       Num1 = c(2, NA, 3, 2, NA), 
       Num2 = c(2,3,3,1,2), 
       Rent= c('y', 'y', 'n', 'y', 'n')) 

index <- apply(is.na(df)*1, 1,paste, collapse = "") 
s <- split(df, index) 
split(df, index) 
for (i in 1:length(s)) 
{ 
    write.csv(s[i], file = paste0("Splits/", i, "splits.csv"), row.names=FALSE, na = "") 
    sdf <- data.frame(s[i]) 
    updated_split <- sdf[,colSums(is.na(sdf))<nrow(sdf)] 
    write.csv(updated_split, file = paste0("updated", i, "split.csv"), row.names=FALSE) 
} 
+0

Спасибо! Он оставляет несколько пустых столбцов в некоторых файлах, но это небольшая проблема, которую я попытаюсь решить позже. – Nik

Смежные вопросы