工作日和周末的子集数据集并计算列的总和

时间:2012-04-02 15:06:33

标签: r date dataframe subset

我正在使用每小时数据集1年,并尝试计算工作日(周一至周五)和周末(坐标,太阳)值的总和,并添加到数据集底部的新行。我的数据框看起来像这样:

enter image description here

我使用以下命令创建了整周的总和:

## calculate column sum
df[366,(3:27)] <- colSums(df[,3:27], na.rm = T)

然后计算每列中缺失值的数量:

## calculate number of missing values in a column

NA.find <- function(x) length(which(is.na(x))) #function for finding missing values
myNumCols <- which(unlist(lapply(df, is.numeric))) 
df[(nrow(df) + 1), myNumCols] <- sapply(df[, myNumCols],NA.find )

现在我正在尝试计算工作日和周末之间的总和(列v1:总数)和缺失值的数量,并像我在所有日子一样添加底部行。

我知道我需要以某种方式定义我的日期,以便R可以读取它然后使用一些如何在工作日和周末进行子集,我想出如何将这样的个体分组:

e = colsplit(df1$date,split=" ",names=c("day1","day2","month"))

df2 = cbind(df1[,c("type","date")],day=e[1],cdate=e[2],month=e[3],df1[,3:ncol(df1)])
df3 = subset(df2, day1 == "Mon")

但是我不确定如何将它说成星期一:星期五和星期六:星期天?

我想要实现的是从(368:371)创建4个新行,并添加工作日总数,工作日缺失值数,周末总数,周末缺失值数。

非常感谢, 阿燕

1 个答案:

答案 0 :(得分:2)

一些评论。

  1. 不要将列总和添加到数据框中。例如,在您的代码中,您有:

    df[366,(3:27)] <- colSums(df[,3:27], na.rm = T)
    

    假设我们将您的数据框集中到每个周末。你的列总和是错误的。将它们存储为单独的载体:

    year_sums =colSums(df[,3:27], na.rm = TRUE)
    
  2. 由于您的数据框中不再有列总和,因此查询起来更容易。因此,要确定缺失值的数量,请执行以下操作:

    colSums(is.na(dd[,3:27])
    

    R将TRUE视为1,将FALSE视为0。

  3. 现在回答你的问题。聪明的方法是使用R的日期对象或使用lubridate包。但是,我建议你先从容易开始的事情开始。只需创建一个新列和子集。在您的示例中,一周的第一天是星期五。所以

    ##M for mid week
    ##W for week end 
    df$type = c("M", "W", "W", "M", "M", "M", "M")
    

    创建一个列,用于标识数据是周末还是周中。所以对于子集,只需:

    df[df$type == "M",]