我想在R中编写一个循环,该循环检查数据帧以将0值更改为中值。不幸的是我得到一个错误。
这只是我循环的一部分。
y <- median(df[1])
Error in median.default(df[1]) : need numeric data
如果我使用,它可以工作。
y <- median(df$name_of_the_column)
这是我的循环。我还没有完成循环。仍在进行中。
i = 1
for (x in df) {
if (df[i][df[i] == 0]) {
df[i][df[i]] <- median(df[i])
}
答案 0 :(得分:3)
用na.aggregate
替换0后,可以很容易地用NA
完成。默认情况下,na.aggregate
在每一列上循环,并将NA
替换为该列的median
library(zoo)
na.aggregate(replace(df, df == 0, NA), FUN = median)
如果需要循环(这里我们在计算median
时排除了0)
for(i in seq_along(df)) {
df[[i]] <- replace(df[[i]], df[[i]] == 0, median(df[[i]][df[[i]] !=0]))
}
OP帖子中的问题是基于median
期望data.frame
输入median
到vector
上应用?median
。根据{{1}}
x-已为其定义方法的对象,或包含要计算其中位数的值的数值向量。
我们可以使用df[,1]
或df[[1]]
将列提取为vector
,然后应用median
获得与$
相同的行为(假设'df'是data.frame
)
答案 1 :(得分:1)
答案取决于您是否希望中位数计算中包含0。这是两种基于tidyverse的解决方案,一种首先将0转换为丢失,使其不属于中值计算,另一种将其包括在计算中(这就是您一直在做的事情):
[Zend]
zend_extension="C:\Program Files (x86)\ZendDebugger-cygwin_nt-vc14\ZendDebugger.dll"
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=allowed_hosts
将0转换为NA,然后转换为中值:
library(tidyverse)
library(dplyr)
df<-
tibble(
a=c(0:9),
b=c(0:9),
c=c(-2:7)
)
直接将0s转换为中位数:
df%>%
mutate_all(
list(~ifelse(.==0,NA,.))
)%>%
mutate_all(
list(~ifelse(is.na(.),median(.,na.rm=TRUE),.))
)