我的数据格式如下:
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;”)
答案 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
对前一个矩阵的每一行,我们使用值cn
对TRUE/FALSE
进行分组,然后将生成的colnames折叠为一个字符串dateTime
列)与新值绑定到名为D