【问题标题】:R: How to find the mean of a column in a data frame, that has non-numeric (specifically, dashes '-') as well as numeric numbers [closed]R:如何在数据框中找到具有非数字(特别是破折号'-')和数字的列的平均值[关闭]
【发布时间】:2017-09-14 06:12:34
【问题描述】:

数据框中的一些条目示例:

我需要在数据框中找到该列的平均值,但找不到它所说的平均值:

" 参数不是数字或逻辑:返回 NA"

非数字条目是破折号,我尝试将它们转换为 NA,但仍在努力产生平均值的结果。

谁能帮忙?

【问题讨论】:

  • 您能否提供一个我们可以在 R 中复制的示例,我们不必根据您的屏幕截图从头开始创建它?
  • 请以其他方式发布数据示例,例如发布dput(head(df))的输出,其中df是您的数据框的名称。此外,如果您使用read.table 系列函数从文件中读取数据,请查看参数na.strings

标签: r mean


【解决方案1】:

试试这个,假设你的数据叫做dat

dat[dat == "-"] <- NA

mean(dat$Population_and_People, na.rm = TRUE]

【讨论】:

  • 感谢您的帮助!它成功地使所有破折号不适用,我在第 6 行还有另一个条目,即单词 - 我最初认为我可以通过使用 tail 函数而不包括它来找到平均值......但它不起作用这就是我所做的- 你有什么想法 mean(tail(death_rate_col, -6), death_rate_col, na.rm = TRUE ) (我将此列的数据框命名为 dead_rate_col)
  • 更新:我实际上在开头有 2 行是单词,其余的是数字或 NA,我使用你的代码作为其中一个单词,它使它成为 NA(我认为消失了)但是它不适用于“标准化死亡率(每 1,000 人)”的另一个条目 - 起作用的条目只是“评价”任何想法为什么标准化的死亡率不会去 NA?我仍然在 R 上收到此响应:[1] NA 警告消息:在 mean.default(death_rate_col, na.rm = TRUE) 中:参数不是数字或逻辑:返回 NA
  • 抱歉,我不确定我是否理解您的问题。所以你的意思是你的向量中有characters而不是-?如果您尝试以下操作会发生什么:dat$Population_and_People &lt;- as.numeric(dat$Population_and_People) 这会将向量中的所有值减少为数字。对于- 和其他characters,R 会将它们转换为NA,因为它无法将它们转换为numerics。那么你应该可以拨打mean(dat$Population_and_People, na.rm = TRUE)
  • 谢谢我会试试这个 - 只是因为我的名字和你的不一样我只是想澄清一下:datPopulation_and_People 有什么区别我相信你说 dat 是名字我的数据作为我的数据框的名称?那么 Population_and_People` 指的是什么?
  • 忽略以上 ^ 我发现 dat 是我的数据框,population and people 是我的数据列名 - 我按照你说的做了,但奇怪的是它完全改变了我的条目的值,一个是 6.2 现在说 41,是字符的条目变成了 78?现在平均值将完全错误,这是我的确切代码:death_rate_col$Population_and_People.X__76&lt;- as.numeric(death_rate_col$Population_and_People.X__76) 然后值发生了变化,所以我的平均值 mean(death_rate_col$Population_and_People.X__76, na.rm = TRUE) 完全关闭了 [1] 38.94643
【解决方案2】:

这没有使用提供的数据,但应该足以显示所需的结果。请注意,这与How to avoid warning when introducing NAs by coercion 有关

x <- c("5", "-", "15")
mean(suppressWarnings(as.numeric(as.character(x))), na.rm = TRUE)
#> [1] 10

【讨论】:

    【解决方案3】:

    另一种方式。

    is.na(dat$Population_and_People.X__76) <- dat$Population_and_People.X__76 == "-"
    

    后跟meanna.rm = TRUE)

    编辑
    请注意,您的专栏可能属于 factor 类。一个 vetcor 只能有一种类型的数据,如果它有一个诸如“-”之类的字符,整个列将在第一步中转换为类character,然后转换为factor。最后一步是默认行为,您必须设置stringsAsFactors = FALSE 以免发生。 (不是这样)实际结果是您不能在该列上使用mean。您很可能需要这样做

    dat$Population_and_People.X__76 <- as.numeric(as.character(dat$Population_and_People.X__76))
    

    在您执行此操作之前,请使用class(dat$Population_and_People.X__76)str(dat) 检查该列的类。

    【讨论】:

    • 也许我误解了这个问题,但我认为发布者的数据中没有NA,而是“-”。因此,您的 is.na() 查询不会返回任何内容以替换为“-”。应该是另一种方式,把“-”换成NA,还是不行?
    • @Martin 不,你错了。如果向量中有NA,函数is.na 可以返回FALSE/TRUE,但也可以将向量的值设置NA,就像我正在使用它一样。
    • 好的,谢谢,我不知道!
    【解决方案4】:

    试试这个:

    dataset$Population_and_People.X_76 <- gsub("-", NA, dataset$Population_and_People.X_76], fixed=TRUE) dataset$Population_and_People.X_76 <- as.numeric(dataset$Population_and_People.X_76) mean(dataset$Population_and_People.X_76, na.rm=TRUE)

    这不会在计算平均值时考虑分母中的处理记录(连字符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2019-06-15
      • 2018-04-05
      • 2018-01-03
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多