【问题标题】:Unstack, or widen a column vector in R在 R 中取消堆叠或加宽列向量
【发布时间】:2018-04-17 16:24:12
【问题描述】:

我正在使用以下格式的日志中的数据:

    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 等,但由于这是一个单卷向量,我不知道如何使它工作。

谢谢!

附言这些数据已经在某种程度上进行了格式化/过滤,因此我认为在导入数据方面没有不同的方法 - 但我愿意接受建议。

【问题讨论】:

    标签: r reshape reshape2


    【解决方案1】:

    您可以将列的备用元素作为单独的列绑定在一起...

    df2 <- cbind(V1=df$V1[seq(1, nrow(df), 2)],
                 V2=df$V1[seq(2, nrow(df), 2)])
    

    【讨论】:

    • 我不确定它在运行时为我提供了什么。这是创建的新df:1437 1869 1437 1872 1437 1870 1758 1871
    • 如果 df 是一个数据框,df$V1 是您的交替数据列,那么 df2 应该是一个有两列的数据框 - V1 的奇数元素 df$V1 ( TASK 术语)和偶数元素的 V2(日期戳)
    • 应该是这样,但事实并非如此。 df2 中的每个数据点都变成了一个数字……很奇怪
    • 啊 - 因为它们是因素。用stringsAsFactors=FALSE读入数据,或者设置df$V1 &lt;- as.character(df$V1)确保它们是字符串。
    • 就是这样。谢谢。
    【解决方案2】:

    回答您的第二个问题,该问题已关闭,因此我无法在此处发布...

    如果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]  
    

    【讨论】:

    • 感谢您的帮助!这一直有效,直到总结: summarise_impl(.data, dots) 中的错误:列 Play 必须长度为 1(汇总值),而不是 8363
    • 奇怪 - 它对我有用。我唯一能想到的是,我假设您以 x 作为字符向量开始。基本上df 需要是一个带有一个变量df$x 的数据框或tibble,它应该是一个字符向量(您的日志数据,每行一行)(而不是一个因素!)。我看不到其他任何可能出错的地方。
    • 知道了!无论出于何种原因,将数据框转换为 tibble 都不适合我——可能是我在我的环境中看不到的东西。但是当它作为数据框保留时,它可以工作。如果我的其他问题被搁置,请在此处发布,以便我将其标记为答案。再次感谢您!
    • 很高兴听到您整理好了!
    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 2019-12-30
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多