删除r中多个文件中的NA列

时间:2015-10-02 07:56:05

标签: r csv dataframe na

我有一个大型数据集,我使用splitting来使数据更加平易近人。我结束了大约250次分裂。因此,每个拆分具有不同的空列数。我想删除空列并写入更新的文件。我能够手动完成,但正如我所提到的,我有大约250个分裂,所以我不能对所有这些分割。

以下是一个可重现的例子:

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 = "")
}

1 个答案:

答案 0 :(得分: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)
}