【问题标题】:long data to wide without a value in column长数据到宽,列中没有值
【发布时间】:2015-11-24 20:31:46
【问题描述】:

我有一个数据让我们说它叫做 df

Inspection  Error
111         A02
112         B02
122         D02
122         A02 

我希望数据按以下方式显示;

Inspection  Error   Error
111         A02 
112         B02 
122         D02      A02

如您所见,122 的“检查”行现在转移到值为 D02 和 A02 的列。我尝试了传播功能和演员,但结果并不接近我想要的。任何建议将不胜感激。 只是一个额外的信息 - 我的检查是数字和错误作为字符。谢谢

【问题讨论】:

    标签: r dplyr long-integer reshape tidyr


    【解决方案1】:

    您可以通过添加一个新列来计算Inspection 的每个级别中的值来实现此目的。然后,您使用该新列强制转换为宽:

    library(reshape2)
    library(dplyr)
    
    dat %>% group_by(Inspection) %>%
      arrange(Error) %>%
      mutate(counter = paste0("Error", 1:n())) %>%
      dcast(Inspection ~ counter, value.var="Error", fill="")
    
      Inspection Error1 Error2
    1        111    A02       
    2        112    B02       
    3        122    A02    D02
    

    根据@David Arenburg 的评论,这是tidyr 版本:

    library(tidyr) 
    
    dat %>% 
      group_by(Inspection) %>%
      arrange(Error) %>%
      mutate(counter = paste0("Error", 1:n())) %>%
      spread(counter, Error, fill = "")
    

    【讨论】:

    • 哇。谢谢eipi10。这让我很开心:) 我知道我必须改变一个新列,只是不知道它应该包含什么值。再次感谢
    • spread(counter, Error, fill = "") 也可以工作(如果Error 是一个字符),因为他们似乎正在寻找tidyr 解决方案。你可能也可以在这里使用row_number()。跨度>
    • 我不认识大卫,我只是用dcast 度过了他的一天 :)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2021-03-16
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多