如何将单元格中包含 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/FALSE
对 cn
进行子集化,并将生成的 colnames 折叠成一个字符串
- 然后我们将之前的 data.frame(实际上只有
dateTime
列)与新值绑定到名为 D
的列中
我有以下格式的数据:
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
returnsTRUE/FALSE
的矩阵在不同的地方为真 从零开始- 对前一个矩阵的每一行使用
apply
,我们使用值TRUE/FALSE
对cn
进行子集化,并将生成的 colnames 折叠成一个字符串 - 然后我们将之前的 data.frame(实际上只有
dateTime
列)与新值绑定到名为D
的列中