2015-10-02 91 views
1

我有一個很大的數據集,我用splitting來使數據更容易接近。我結束了約250分裂。因此,每個分組都有不同數量的空列。我想刪除空列並寫入更新的文件。我能夠手動完成,但正如我所提到的,我有大約250次拆分,所以我無法完成所有這些拆分。刪除r中多個文件中的NA列

下面是一個可重複的例子:

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