我已经看到很多帖子,其中数据格式从宽转换为长。虽然我的问题有点复杂。我有一个这样的数据框:
id Start_time_of_conversation End_time_of_conversation Participant1 Participant2
id1 07:00 08:00 A B
id2 07:00 09:00 C D
我想将此数据帧转换为这样的东西:
id time(in min) dataName dataValue
id1 07:00 Participant1 A
id1 07:00 Participant2 B
id2 07:00 Participant1 C
id2 07:00 Participant2 D
id1 07:01 Participant1 A
id1 07:01 Participant2 B
id2 07:01 Participant1 C
id2 07:01 Participant2 D
...
id1 08:59 Participant1 A
id1 08:59 Participant2 B
id1 09:00 Participant1 A
id1 09:00 Participant2 B
因此,不仅将其更改为长格式,而且还在时间范围Start_time_of_conversation和End_time_of_conversation之间的每一分钟生成一个新行(由2位参与者组成的两行)。
我当时在想,也许我应该使用seq()和melt()来做到这一点,尽管我确实没有看到,如果没有很多拼凑,我怎么能做到这一点。我应该首先创建一个长格式,然后将每个范围/行转换为分钟序列,还是有一种更简单的方法?
一种选择是使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
,按'id','Participant1'和'Participant2'分组,我们得到'Datetime'列的序列(用转换为POSIXlt
类之后strptime
)。
library(data.table)
DT <- setDT(df1)[,
list(time_in_mins =format(seq(strptime(Start_time_of_conversation,
format="%H:%M"),
strptime(End_time_of_conversation, format="%H:%M"), by = "1 min"),
"%H:%M")) , .(id,Participant1, Participant2)]
使用上面的输出,我们melt
可以将“参与者”列转换为“长”格式,并order
在必要时进行转换。
melt(DT, id.var=c("id", "time_in_mins"),
variable.name= "dataName",
value.name= "dataValue")[order(time_in_mins, id, dataName)]
# id time_in_mins dataName dataValue
# 1: id1 07:00 Participant1 A
# 2: id1 07:00 Participant2 B
# 3: id2 07:00 Participant1 C
# 4: id2 07:00 Participant2 D
# 5: id1 07:01 Participant1 A
# ---
#360: id2 08:58 Participant2 D
#361: id2 08:59 Participant1 C
#362: id2 08:59 Participant2 D
#363: id2 09:00 Participant1 C
#364: id2 09:00 Participant2 D
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句