【问题标题】:Selection of a column in R在 R 中选择一列
【发布时间】:2020-04-11 09:50:30
【问题描述】:

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

【问题讨论】:

  • 尝试df[,1]d[[1]],因为df[1] 仍然是一个具有一列的data.frame,其中[,1][[1]] 将列提取为向量,就像$median 工作在 vector 作为输入
  • 感谢您的解释。其作品。现在我必须处理我的循环。这根本不起作用;)。
  • 我在下面发布了一个解决方案,其中包含一些解释和一个 for 循环

标签: r dataframe


【解决方案1】:

答案取决于您是否希望将 0 作为中位数计算的一部分。这是两个基于 tidyverse 的解决方案,一个首先将 0 转换为缺失,因此它们不是中位数计算的一部分,另一个将它们包含在计算中(这似乎是您一直在做的):

library(tidyverse)
library(dplyr)

df<-
tibble(
  a=c(0:9),
  b=c(0:9),
  c=c(-2:7)
)

将 0 转换为 NA,然后转换为中位数:

df%>%
  mutate_all(
    list(~ifelse(.==0,NA,.))
  )%>%
  mutate_all(
    list(~ifelse(is.na(.),median(.,na.rm=TRUE),.))
  )

将0直接转换为中位数:

df%>%
  mutate_all(
    list(~ifelse(.==0,median(.,na.rm=TRUE),.))
  )

【讨论】:

    【解决方案2】:

    NA 替换 0 后,用na.aggregate 可以轻松完成。默认情况下,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 帖子中的问题基于在 data.frame 上应用 median,因为 median 期望输入为 vector。根据?median

    x - 已定义方法的对象,或包含要计算其中值的值的数值向量。

    我们可以使用df[,1]df[[1]] 将列提取为vector,然后应用median 以获得与$ 相同的行为(假设'df' 是data.frame

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多