取消堆叠或加宽 R 中的列向量
Unstack, or widen a column vector in R
我正在处理日志中的数据,其中的数据格式如下:
V1
1 TASK [include_vars]
2 Thursday 05 April 2018 20:21:52 -0500 (0:00:00.429) 0:00:00.429
3 TASK [include_vars]
4 Thursday 05 April 2018 20:21:53 -0500 (0:00:00.289) 0:00:00.718
5 TASK [include_vars]
6 Thursday 05 April 2018 20:21:53 -0500 (0:00:00.270) 0:00:00.988
每个时间戳对应于它上面的任务。我需要的是将每个时间戳移动到一个新列并向上移动一行(以便与它对应的任务保持一致)。我已经厌倦了使用 dcast、unstack、spread 等,但由于这是一个单卷矢量,我不确定如何进行这项工作。
谢谢!
p.s。此数据已经有点 formatted/filtered,所以我认为导入它的方法没有不同 - 但我愿意接受建议。
您可以将列的备用元素作为单独的列绑定在一起...
df2 <- cbind(V1=df$V1[seq(1, nrow(df), 2)],
V2=df$V1[seq(2, nrow(df), 2)])
回答你的第二个问题,这个问题已经关闭,所以我不能post那里...
如果 x
是您的日志数据向量,那么...
library(tidyverse)
df <- tibble(x=x) #convert to tibble
df <- df %>% mutate(Type=ifelse(str_detect(x,"PLAY"), "PLAY",
ifelse(str_detect(x,"TASK"), "TASK",
ifelse(str_detect(x,"\d\:\d"),"TimeStamp",
"Other"))),
TaskNo=cumsum(Type=="TASK"|Type=="PLAY")) %>%
group_by(TaskNo) %>%
summarise(Play=first(x[Type=="PLAY"]),
Task=first(x[Type=="TASK"]),
TimeStamp=first(x[Type=="TimeStamp"]),
Other=paste(x[Type=="Other"],collapse=","))
df
# A tibble: 9 x 5
TaskNo Play Task TimeStamp Other
<int> <chr> <chr> <chr> <chr>
1 1 PLAY [all] NA NA ""
2 2 NA TASK [validate_fact~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]
3 3 NA TASK [validate_fact~ Thursday 05 April~ ""
4 4 NA TASK [validate_fact~ Thursday 05 April~ ""
5 5 NA TASK [validate_os_f~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]
6 6 NA TASK [validate_os_f~ Thursday 05 April~ ""
7 7 PLAY [k8s-cluster] NA NA ""
8 8 NA TASK [idns/idns-set~ Thursday 05 April~ ok: [NodeA -> NodeA] => (item=idns_user) => {~
9 9 NA TASK [idns/idns-set~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]
我正在处理日志中的数据,其中的数据格式如下:
V1
1 TASK [include_vars]
2 Thursday 05 April 2018 20:21:52 -0500 (0:00:00.429) 0:00:00.429
3 TASK [include_vars]
4 Thursday 05 April 2018 20:21:53 -0500 (0:00:00.289) 0:00:00.718
5 TASK [include_vars]
6 Thursday 05 April 2018 20:21:53 -0500 (0:00:00.270) 0:00:00.988
每个时间戳对应于它上面的任务。我需要的是将每个时间戳移动到一个新列并向上移动一行(以便与它对应的任务保持一致)。我已经厌倦了使用 dcast、unstack、spread 等,但由于这是一个单卷矢量,我不确定如何进行这项工作。
谢谢!
p.s。此数据已经有点 formatted/filtered,所以我认为导入它的方法没有不同 - 但我愿意接受建议。
您可以将列的备用元素作为单独的列绑定在一起...
df2 <- cbind(V1=df$V1[seq(1, nrow(df), 2)],
V2=df$V1[seq(2, nrow(df), 2)])
回答你的第二个问题,这个问题已经关闭,所以我不能post那里...
如果 x
是您的日志数据向量,那么...
library(tidyverse)
df <- tibble(x=x) #convert to tibble
df <- df %>% mutate(Type=ifelse(str_detect(x,"PLAY"), "PLAY",
ifelse(str_detect(x,"TASK"), "TASK",
ifelse(str_detect(x,"\d\:\d"),"TimeStamp",
"Other"))),
TaskNo=cumsum(Type=="TASK"|Type=="PLAY")) %>%
group_by(TaskNo) %>%
summarise(Play=first(x[Type=="PLAY"]),
Task=first(x[Type=="TASK"]),
TimeStamp=first(x[Type=="TimeStamp"]),
Other=paste(x[Type=="Other"],collapse=","))
df
# A tibble: 9 x 5
TaskNo Play Task TimeStamp Other
<int> <chr> <chr> <chr> <chr>
1 1 PLAY [all] NA NA ""
2 2 NA TASK [validate_fact~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]
3 3 NA TASK [validate_fact~ Thursday 05 April~ ""
4 4 NA TASK [validate_fact~ Thursday 05 April~ ""
5 5 NA TASK [validate_os_f~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]
6 6 NA TASK [validate_os_f~ Thursday 05 April~ ""
7 7 PLAY [k8s-cluster] NA NA ""
8 8 NA TASK [idns/idns-set~ Thursday 05 April~ ok: [NodeA -> NodeA] => (item=idns_user) => {~
9 9 NA TASK [idns/idns-set~ Thursday 05 April~ ok: [NodeA],ok: [NodeB],ok: [NodeC]