R-如何获取不同列的非NA间隔的平均值/中位数/标准偏差?

时间:2019-04-16 09:29:45

标签: r

我想计算不同列的“非NA值间隔”。

这是数据集:

temp <- data.frame(
  date = seq(as.Date("2018-01-01"), by = 'month', length.out = 12),
  X1 = c(100, NA, 23, NA, NA, 12, NA, NA, NA, NA, NA, 100),
  X2 = runif(12, 50, 100),
  X3 = c(24, NA, NA, NA, NA, 31, 1, NA, 44, NA, 100, NA),
  X4 = NA
)

例如,X1的非NA间隔为1, 2, 5,这意味着从100到23,这两个非NA值之间有1个NA,从23到12,有一个这两个非NA值之间有2个NA,从12到100,这两个非NA值之间有5个NA。

预期结果是:

result <- data.frame(
  X1_inv_mean = mean(c(1, 2, 5)),
  X1_inv_median = median(c(1, 2, 5)),
  X1_inv_sd = sd(c(1, 2, 5)),

  X2_inv_mean = mean(0),
  X2_inv_median = median(0),
  X2_inv_sd = sd(0),

  X3_inv_mean = mean(c(4, 1, 1, 1)),
  X3_inv_median = median(c(4, 1, 1, 1)),
  X3_inv_sd = sd(c(4, 1, 1, 1)),

  X4_inv_mean = NA,
  X4_inv_median = NA,
  X4_inv_sd = NA
)

>result
  X1_inv_mean X1_inv_median X1_inv_sd X2_inv_mean X2_inv_median X2_inv_sd X3_inv_mean X3_inv_median X3_inv_sd
1    2.666667             2  2.081666           0             0        NA        1.75             1       1.5
  X4_inv_mean X4_inv_median X4_inv_sd
1          NA            NA        NA

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

基本R选项

out <- lapply(temp[-1], function(x) {
  if(all(is.na(x))) {
    tmp <- NA
  } else {
    tmp <- with(rle(is.na(x)), lengths[values])
    c(mean = mean(tmp),
      median = median(tmp),
      sd = sd(tmp))}
  })

as.data.frame(out)
#             X1  X2   X3 X4
#mean   2.666667 NaN 1.75 NA
#median 2.000000  NA 1.00 NA
#sd     2.081666  NA 1.50 NA

使用rle,以下每一行为您提供NA的运行情况

tmp <- with(rle(is.na(x)), lengths[values])

例如对于列X1

with(rle(is.na(temp$X1)), lengths[values])
#[1] 1 2 5

然后,我们为每个tmp计算您的摘要统计信息。

如果列中的所有值均为NA,则该函数返回NA

答案 1 :(得分:0)

更新: 对于变量n列:

command <- ""
summaryString <- ""
for(i in colnames(temp)){
     if(i != "date"){
       print(i)
       summaryString <- paste(summaryString,i,"_inv_mean = mean(",i,", na.rm = T),",sep="")
       summaryString <- paste(summaryString,i,"_inv_median = median(",i,", na.rm = T),",sep="")
       summaryString <- paste(summaryString,i,"_inv_sd = sd(",i,", na.rm = T),",sep="")
     }

   command <- paste("output <- temp %>% summarise(",substr(summaryString, 0, nchar(summaryString)-1),")",sep="")
}

eval(parse(text=command))

使用dplyr:

library(dplyr)
output <- temp%>%
  summarise(x1_inv_mean = mean(X1, na.rm = T),
        x1_inv_median = median(X1, na.rm = T),
        x1_inv_sd = sd(X1, na.rm = T),
        x2_inv_mean = median(X2, na.rm = T),
        x2_inv_median = mean(X2, na.rm = T),
        x2_inv_sd = sd(X2, na.rm = T),
        x3_inv_mean = median(X3, na.rm = T),
        x3_inv_median = mean(X3, na.rm = T),
        x3_inv_sd = sd(X3, na.rm = T),
        x4_inv_mean = mean(X4, na.rm = T),
        x4_inv_median = median(X4, na.rm = T),
        x4_inv_sd = sd(X4, na.rm = T))