【问题标题】:rowmean and standard deviation using data.table使用 data.table 的行均值和标准差
【发布时间】:2019-10-31 20:57:27
【问题描述】:
x <- matrix(rnorm(500 * 10), nrow = 500, ncol = 10)
x[, 1] <- 1:500

x <- data.frame(x)
names(x) <- c('ID', 2000:2008)      

library(data.table)
setDT(x)

我想计算均值、标准差和否。每行的数据点数,但我收到错误

x[, c("meanY",'sdY',"nY") := .(rowMeans(.SD, na.rm = TRUE), sd(.SD, na.rm = TRUE), rowSums(!is.na(.SD))), .SDcols=c(2:10)]

【问题讨论】:

  • data.table|frames 没有 sd 方法。试试sd(iris, na.rm=TRUE) 你会得到同样的错误。你到底想要什么?
  • 我需要每一行的平均值、标准差和数据点数。我的原始数据在某些行中有 NA,这也是我使用 na.rm = T 的原因。
  • x[, c("meanY",'sdY',"nY") := .(rowMeans(.SD, na.rm = TRUE), sd(.SD, na.rm = TRUE), rowSums(!is.na(.SD))), .SDcols=c(2:10), by=ID] 怎么样?
  • @MichaelChirico,我不确定您所说的 There is no sd method for data.table 是什么意思?

标签: r data.table


【解决方案1】:

问题在于sd() 不能按行工作。

x[,
  c("meanY",'sdY',"nY") := 
    .(rowMeans(.SD, na.rm = TRUE), 
      apply(.SD, 1, sd, na.rm = TRUE), 
      rowSums(!is.na(.SD))), 
  .SDcols = 2:10]

【讨论】:

    【解决方案2】:

    假设输出为一个列表,可以使用以下代码试一试:

    op <- c("mean","sd","length")
    r <- lapply(op, function(v) apply(x, 1, eval(parse(text = v))))
    names(r) <- op
    

    它应该与您的data.frame 示例一起使用:

    x <- matrix(rnorm(500 * 10), nrow = 500, ncol = 10)
    x[, 1] <- 1:500
    x <- data.frame(x)
    names(x) <- c('ID', 2000:2008) 
    

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2012-03-27
      • 2019-06-14
      • 2017-10-09
      • 1970-01-01
      • 2019-01-25
      • 2020-08-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多