如何在单元格中重塑0和1的数据,使其只有1

时间:2018-02-06 11:32:22

标签: r multiple-columns reshape

我的数据格式如下:

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&amp;在连续的时间戳上为0。

要做:

我想生成一个包含2列的新数据框:dateTime标记,以及一个列,其中包含当时非零的所有列的名称。

真的很开心:

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

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

QUERY:

现在,如何将其转换为以下格式?

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)

如何避免在子集化时丢失时间戳信息? (注意第3个时间戳的NA值为D1,D2和D3都是“0&#39;”)

1 个答案:

答案 0 :(得分:3)

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

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 

说明:

  • 我们将名称(不包括dateTime)存储到名为cn
  • 的向量中
  • df[,-1] != 0返回TRUE/FALSE的矩阵为TRUE,其中不同 从零
  • 使用apply对前一个矩阵的每一行,我们使用值cnTRUE/FALSE进行分组,然后将生成的colnames折叠为一个字符串
  • 然后我们将之前的data.frame(实际只有dateTime列)与新值绑定到名为D
  • 的列中