2

我有类似的数据

set.seed(6)
df <- data.frame(t = as.Date("2014/1/1")+seq(0,100.25,.25),
    name = paste(sample(c("Alert_","NonOp_"),402,replace=TRUE),
                  sample(1:10,402,replace=TRUE),sep=""),
    unit = c(rep(1:10,each=40),10,10))
head(df)

下面是一些有代表性的数据

head(df)
            t     name   unit
1  2014-01-01  NonOp_3      1
2  2014-01-01  NonOp_6      1
3  2014-01-01  Alert_5      1
4  2014-01-01  Alert_7      1
5  2014-01-02  NonOp_4      1
6  2014-01-02  NonOp_2      1

如何从名称生成一个表,其中该表具有单元列,t,然后名称列中的名称被强制转换为没有警报/非操作的名称分解列,并且分解名称列中的值应该是 NA 、A(用于警报)和 N(用于 NonOp)。这是我要查找的表格类型,如果上面的所有数字都是针对单元 1 的。

unit               t   name_1 name_2 name_3 name_4 name_5 name_6 name_7 name_8 ...
   1      2014-01-01       NA     NA      N     NA      A      A      A     NA
   1      2014-01-02       NA      N     NA      N     NA     NA     NA     NA

目标是将命名的alerts/nonops 放入一个按unit/t 排序的表中,并将该表写入一个文件。并将文件读入excel。

4

2 回答 2

4

听起来您正在寻找以下内容:

library(reshape2)
newdf <- cbind(df, colsplit(df$name, "_", c("V1", "V2")))
newdf$V1 <- factor(newdf$V1, c("NonOp", "Alert"), c("N", "A"))
newdf$V2 <- paste0("name_", newdf$V2)
head(newdf)
#            t    name unit V1     V2
# 1 2014-01-01 NonOp_3    1  N name_3
# 2 2014-01-01 NonOp_6    1  N name_6
# 3 2014-01-01 Alert_5    1  A name_5
# 4 2014-01-01 Alert_7    1  A name_7
# 5 2014-01-02 NonOp_4    1  N name_4
# 6 2014-01-02 NonOp_2    1  N name_2

head(dcast(newdf, t ~ V2, value.var = "V1"))
#            t name_1 name_10 name_2 name_3 name_4 name_5 name_6 name_7 name_8 name_9
# 1 2014-01-01   <NA>    <NA>   <NA>      N   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>
# 2 2014-01-01   <NA>    <NA>   <NA>   <NA>   <NA>   <NA>      N   <NA>   <NA>   <NA>
# 3 2014-01-01   <NA>    <NA>   <NA>   <NA>   <NA>      A   <NA>   <NA>   <NA>   <NA>
# 4 2014-01-01   <NA>    <NA>   <NA>   <NA>   <NA>   <NA>   <NA>      A   <NA>   <NA>
# 5 2014-01-02   <NA>    <NA>   <NA>   <NA>      N   <NA>   <NA>   <NA>   <NA>   <NA>
# 6 2014-01-02   <NA>    <NA>      N   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>

基本上,首先将“名称”列分成两列,然后使用dcast. 其他步骤主要是装饰性的。


另一种方法是使用我的cSplit函数dcast.data.table“data.table”包。

跳过诸如创建“name_blah”并将“NonOp”替换为“N”等内容,您可以直接执行以下操作:

dcast.data.table(cSplit(df, "name", "_"), t ~ name_2, value.var = "name_1")
#               t     1 10     2     3     4     5     6     7  8  9
#   1: 2014-01-01    NA NA    NA NonOp    NA    NA    NA    NA NA NA
#   2: 2014-01-01    NA NA    NA    NA    NA    NA NonOp    NA NA NA
#   3: 2014-01-01    NA NA    NA    NA    NA Alert    NA    NA NA NA
#   4: 2014-01-01    NA NA    NA    NA    NA    NA    NA Alert NA NA
#   5: 2014-01-02    NA NA    NA    NA NonOp    NA    NA    NA NA NA
#  ---                                                              
# 398: 2014-04-10    NA NA    NA    NA    NA    NA NonOp    NA NA NA
# 399: 2014-04-10    NA NA    NA    NA NonOp    NA    NA    NA NA NA
# 400: 2014-04-10 NonOp NA    NA    NA    NA    NA    NA    NA NA NA
# 401: 2014-04-11    NA NA    NA NonOp    NA    NA    NA    NA NA NA
# 402: 2014-04-11    NA NA Alert    NA    NA    NA    NA    NA NA NA
于 2014-09-16T18:34:47.853 回答
1

你也可以使用dplyr

library(dplyr)
library(tidyr)
res <- df %>% 
separate(name, c("V1", "V2")) %>%
mutate(V1=substr(V1, 1, 1), V2 =paste0("name_", V2)) %>%
select(-unit) %>% 
spread(key=V2, value=V1) 

library(gtools)
res1 <- res[,c(1,mixedorder(names(res)[-1])+1)]
 head(res1,2)
  #         t name_1 name_2 name_3 name_4 name_5 name_6 name_7 name_8 name_9
 #1 2014-01-01   <NA>   <NA>      N   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>
 #2 2014-01-01   <NA>   <NA>   <NA>   <NA>   <NA>      N   <NA>   <NA>   <NA>
 # name_10
 #1    <NA>
 #2    <NA>
于 2014-09-16T18:54:50.550 回答