R: объединение описательных столбцов и связанных значений в матричную форму

У меня есть длинный набор данных операций (op #) и times {tm #), связанных с различными виджетами. К сожалению, операции не имеют определенного порядка, поэтому операция крашения может произойти в первой операции или в 80-м. Каждая операция имеет соответствующее время, необходимое для завершения этой операции в столбце справа. Я хотел бы организовать данные так, чтобы каждый столбец был уникальным именем операции, а значения в столбце - это время, которое требуется для завершения этой операции.

# sample data frame
df = data.frame(widget = c("widget 1", "widget 2", "widget 3", "widget 4"),
 op1 = c("paint", "weld", "frame", "weld"),
 tm1 = c(20, 24, 14, 40),
 op2 = c("weld", "coat", "weld", "paint"),
 tm2 = c(10, 20, 50, 30))
print(df)
> part op1 tm1 op2 tm2 
> 1 widget1 paint 20 weld 10
> 2 widget2 weld 24 coat 20
> 3 widget3 frame 14 weld 50
> 4 widget4 weld 40 paint 30

Я пытаюсь реорганизовать фрейм данных как...

> part paint weld coat frame 
> 1 widget1 20 10 NULL NULL
> 2 widget2 NULL 24 20 NULL
> 3 widget3 NULL 50 NULL 14
> 4 widget4 30 40 NULL NULL

Любые предложения?

1 ответ

Try:

If `df1` is the dataset
names(df1)[grep("^op|^tm",names(df1))] <- gsub("([[:alpha:]]+)(\\d+)", "\\1_\\2", names(df1)[grep("^op|^tm", names(df1))])
 df2 <- reshape(df1, idvar="widget", varying= grep("^op|^tm",names(df1)), sep="_", direction="long")
 library(reshape2)
 dcast(df2, widget~op, value.var="tm")[,c(1,3:5,2)]
 # widget paint weld coat frame
 #1 widget 1 20 10 NA NA
 #2 widget 2 NA 24 20 NA
 #3 widget 3 NA 50 NA 14 ##looks like you have 50 instead of 60 as shown in the expected
 #4 widget 4 30 40 NA NA
  • Я использовал комбинацию grep и gsub для изменения имен этих столбцов (tm, op), так что существует разделение _ между общими символами и соответствующими номерами, что упрощает для работы с reshape
  • После преобразования в более длинный формат переформатируйте его обратно в другой формат с помощью dcast

licensed under cc by-sa 3.0 with attribution.