如何将单元格中包含 0 和 1 的数据重塑为只有包含 1 的单元格

How to reshape data with 0 and 1 in cells to have only cells with 1

我有以下格式的数据:

datetime <- c('2016-01-01 00:00:00','2016-01-01 00:01:00', '2016-01-01 00:02:00',....)
D1 <- c(1, 1, 0, ...)
D2 <- c(0, 1, 0, ...)
D3 <- c(1, 0, 0, ...)
df <- data.frame(datetime,D1,D2,D3)

基本上,我有几列在连续的时间戳中包含 1 和 0。

待办事项:

我想生成一个包含 2 列的新数据框:日期时间戳,以及包含当时非零的所有列的名称的单个列。

目前已尝试:

我可以使用 reshape 将第一个数据帧从长格式转换为宽格式,然后删除带有 0 的行。

molten <- melt(df, id = c("datetime"))
new <- subset(molten, molten$value > 0)

查询:

现在,如何把它转换成下面的格式呢?

dateTime <- c('2016-01-01 00:00:00','2016-01-01 00:01:00', '2016-01-01 00:02:00',....)
D <- c('D1,D3' , 'D1,D2', '', ...)
new_df <- data.frame(dateTime,D)

以及如何避免子集化时发生的时间戳信息丢失? (注意第三个时间戳有一个 NA 值,因为当时 D1、D2 和 D3 都为“0”)

这是一个可能的解决方案:

cn <- colnames(df)[-1]
new_df <- cbind(df['datetime'],
                D=apply( df[,-1] != 0, 1 , function(x) paste(cn[x],collapse=',')))

> new_df
             dateTime     D
1 2016-01-01 00:00:00 D1,D3
2 2016-01-01 00:01:00 D1,D2
3 2016-01-01 00:02:00 

解释:

  • 我们将 colnames(不包括 dateTime)存储到一个名为 cn
  • 的向量中
  • df[,-1] != 0 returns TRUE/FALSE 的矩阵在不同的地方为真 从零开始
  • 对前一个矩阵的每一行使用 apply,我们使用值 TRUE/FALSEcn 进行子集化,并将生成的 colnames 折叠成一个字符串
  • 然后我们将之前的 data.frame(实际上只有 dateTime 列)与新值绑定到名为 D
  • 的列中