我有一个冗长的操作数据集 (op#) 和时间 {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
有什么建议吗?
最佳答案
尝试:
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
更容易
- reshape 为更长的格式后,使用
dcast
将其重新格式化回不同的宽格式
关于R:将描述性列和相关值组合成矩阵形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25147469/