【问题标题】:Can I calculate variance using dplyr::mutate?我可以使用 dplyr::mutate 计算方差吗?
【发布时间】:2015-02-07 00:02:51
【问题描述】:

我想在我的数据表中创建一个新列,其中存储在我的表中的其他一些列中的值的差异。我认为 dplyr 包中的 mutate 函数对我来说是最好的解决方案,但不幸的是它似乎不起作用。

这是我正在使用的代码:

require(dplyr)
CPI <- read.csv("CPI.csv", sep = ";")
CPI <- tbl_df(CPI)    
CPI <- mutate(CPI, variance = var(CPI.1:CPI.6, na.rm = T))

这是我得到的错误回报:

Error in c(1.3, 1.4, 2.9, 3.1, NA, NA, NA, NA, NA, NA, NA, NA):c(NA, 1.2253333335,  : 
  NA/NaN argument

是否可以使用 mutate 计算方差?我应该使用其他解决方案吗?

【问题讨论】:

  • 如果你有tidy data,你会发现这种操作更容易执行

标签: r dplyr variance


【解决方案1】:

如果CPI.1:CPI.6 的评估符合您的预期,我会感到惊讶。为什么不直接使用你原来的data.frame 并这样做:

m <- as.matrix(subset(CPI, select=CPI.1:CPI.6))
apply(m, 1, var, na.rm=TRUE)

或使用matrixStats 包以提高速度和清晰度:

rowVars(m)

【讨论】:

    【解决方案2】:

    如果您需要每行的方差,可以选择使用 dorowwise()

    library(dplyr)
    nm1 <- paste('CPI', 1:6, sep='.')
    CPI %>% 
        rowwise() %>% 
        do(data.frame(., variance=var(unlist(.[nm1]), na.rm=TRUE)))
    

    数据

    set.seed(25)
    CPI <- as.data.frame(matrix(sample(c(NA,1:40), 7*20, replace=TRUE), 
               ncol=7, dimnames=list(NULL, paste('CPI', 1:7, sep="."))))
    

    【讨论】:

      【解决方案3】:

      看来您需要逐行执行操作。你可以试试这个

      require(dplyr)
      CPI <- read.csv("CPI.csv", sep = ";")
      CPI <- tbl_df(CPI)    
      CPI <- group_by(CPI, 1:nrow(CPI))    
      CPI <- mutate(CPI, variance = var(CPI.1:CPI.6, na.rm = T))
      

      或者你还想做什么?

      【讨论】:

        猜你喜欢
        • 2015-06-17
        • 2022-08-05
        • 2015-04-01
        • 2020-08-14
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2021-04-23
        • 2022-11-20
        相关资源
        最近更新 更多