在R中选择列

时间:2019-12-18 19:27:01

标签: r dataframe

我想在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])
  }

2 个答案:

答案 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输入medianvector上应用?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),.))
  )