【问题标题】:Computing rowwise means with dplyr, na.rm not working按行计算意味着使用 dplyr,na.rm 不起作用
【发布时间】:2015-11-07 21:10:01
【问题描述】:

我正在使用以下代码来计算数据中几列的平均值:

df %>% rowwise() %>% mutate(avg=mean(Responsiveness:Translation, na.rm=TRUE))

我不断收到错误:

Error: NA/NaN argument

我知道我的一些数据有 N/A 值,但为什么 na.rm=TRUE 不处理它们?

【问题讨论】:

  • 请提供一些示例数据和预期输出。 This 会对此有所帮助。
  • 这个错误可能是因为你有一个字符'N/A'值而不是真正的NA。它还会将列类从数字更改为“字符”或“因子”,具体取决于您是否在 read.csv 中使用了 stringsAsFactors=FALSE。当您使用read.csv/read.table 读取数据集时,您可以指定na.strings='N/A',以便将其读取为真实的 NA,并且列将是数字。

标签: r dplyr mean na


【解决方案1】:

这是在dplyr 中使用rowMeans 的一个选项。我们select 从“响应”到(:)“翻译”的列,mutate 数据集以使用rowMeans 创建列“平均”,指定na.rm=TRUE 以删除NA 值,和cbind (bind_cols) 与原始数据集中的其余列通过用mutated 数据集中未找到的列(即.)对原始数据集进行子集化。我们可以使用setdiff 来获取列名。

 library(dplyr)
 df %>% 
     select(Responsiveness:Translation) %>% 
     mutate(avg= rowMeans(., na.rm=TRUE)) %>% 
     bind_cols(df[setdiff(names(df), names(.))] , .)

但是,rowMeans 可以在不使用任何外部包的情况下完成。在base R 中,我们match 列“响应性”、“翻译”以及原始数据集的列名。这给出了这些列的数字索引。我们可以从'start'(i1[1])、'end'(i1[2])获取序列(:),并在subset数据集上使用rowMeans

 i1 <- match( c('Responsiveness', 'Translation'), names(df))
 df$avg <- rowMeans(df[i1[1]:i1[2]], na.rm=TRUE)

如果我们使用'i1',我们也可以删除上面dplyr代码中的一些步骤

 df %>%
      mutate(avg= rowMeans(.[i1[1]:i1[2]], na.rm=TRUE))

注意:我在 R 3.2.1 上使用 dplyr_0.4.1.9000。当没有NA 值时,OP 的代码给出与rowMeans 相同的输出。但是,如果有 NA 值,我会得到一个不同的值,即对于示例中的第二行,我会得到 3.5 而不是 3.66667。不过,我没有收到任何错误。

数据

set.seed(24)
df <- data.frame(V1=1:10, Responsiveness=1:10, V2= c(2, NA, 4:11), 
              V3=3:12, Translation=4:13)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2018-07-24
    • 2014-05-11
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多