在 R 中使用 FOR 循环查找和替换文件中.csv中位数



我是这里的新手,也是R的新手,
我已经浏览了这里的问题,但找不到可以帮助我的问题。
因此,如果我只是搜索错误的东西,请在这里道歉。

我使用以下代码来帮助我找到每列的中位数,数据中有 195 列。 我正在使用na.rm = True.
然后尝试用新计算的中位数替换 NA。
我使用了几种不同的方法,但一直卡住。 任何建议都会很好。

dataset <- list.files(path = getwd(), pattern = "*.csv", all.files = T )
n <- length(dataset)
for (i in 1:n) {
cat("n",i)
z <- median(dataset, na.rm = TRUE)
dataset[is.na(dataset)] <- z
return(dataset)
write.csv(Filename, file = "Filename.csv")
}

提前谢谢。

有一种更简单的方法可以做到这一点,使用apply

apply(dataset, 2, median, na.rm = TRUE)

2只是说将您的函数应用于列而不是行

有了整洁的宇宙,就不需要循环了:

data %>% mutate_all(funs(ifelse(is.na(.),median(.,na.rm=TRUE),.)))

或更短:

data %>% mutate_all(funs(coalesce(.,median(.,na.rm=TRUE))))

您的代码存在一些问题: 您的第一个命令

dataset <- list.files(path = getwd(), pattern = "*.csv", all.files = T )

返回文件名列表。因此,如果你想处理所有文件,你需要在for循环中调用一个像read.csv这样的函数。您的代码示例尝试计算文件名列表的中位数。

此外,您指定了循环索引 i,但随后您不在 for 循环中使用它来访问文件名列表的正确元素。

因此,在循环中,您需要一行如下:

data <- read.csv(dataset[[i]])

另外,要进行中位数插补,您需要应用中位数函数行, 使用像lapply这样的函数或 Nicolas2 的答案中的整洁宇宙方法。

您的 return 语句不是必需的,因为这不是函数。您的write.csv功能 期望一个名为"文件名"的变量,该变量未在任何地方定义。 它应该读起来像

write.csv(data, file = dataset[[i]]])

(前提是您在文件中读取为for循环中的"数据"(。

总而言之,这样的事情应该有效:

dataset <- list.files(path = getwd(), pattern = "*.csv", all.files = T )
n <- length(dataset)
for (i in 1:n) {
cat("n",i)
data <- read.csv(dataset[[i]])
#from Nicolas2's answer   
data <- data %>% mutate_all(funs(ifelse(is.na(.),median(.,na.rm=TRUE),.)))
# uncomment the following line only if you are sure that you have a backup
# of your original files as this may overwrite the original files
# write.csv(data, file = dataset[[i]]) 
}

最新更新