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

时间:2018-09-04 08:54:17

标签: r

我是这里的新手,也是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")
}

先谢谢了。

3 个答案:

答案 0 :(得分:0)

使用apply

有一种更简单的方法
apply(dataset, 2, median, na.rm = TRUE)

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

答案 1 :(得分:0)

使用tidyverse,无需循环:

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

或更短:

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

答案 2 :(得分:0)

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

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

返回文件名列表。因此,如果要处理所有文件,则需要在for循环内调用read.csv之类的函数。您的代码示例尝试计算文件名列表的中位数。

也可以指定循环索引i,但是不要在for循环内使用它来访问文件名列表的正确元素。

在循环中,因此需要这样的一行:

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

此外,您要进行中位数插补,您需要逐行应用中位数函数, 使用lapply之类的函数或Nicolas2的答案中的tidyverse方法。

您的return语句不是必需的,因为这是没有功能的。您的write.csv函数 需要一个名为“ Filename”的变量,该变量未定义。 它应该看起来像

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]]) 
}