我是这里的新手,也是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")
}
先谢谢了。
答案 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]])
}