我有像
这样的数据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
如何从名称生成表,其中表具有unit,t列,然后名称列中的名称被强制转换为不带Alert / NonOp的名称因素列,以及因式名称列中的值应该是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转换为按单元/ t排序的表,并将表写入文件。并将文件读入excel。
答案 0 :(得分: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>
基本上,首先要拆分&#34;名称&#34;列分为两列,然后使用dcast
。其他步骤主要是化妆品。
另一种方法是使用&#34; data.table&#34;中的my cSplit
function和dcast.data.table
。包。
跳过诸如创造&#34; name_blah&#34;之类的东西。并取代&#34; NonOp&#34;用&#34; N&#34;等等,你可以直接做:
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
答案 1 :(得分: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>