我有一个如下所示的数据框:
mCodes datetime
1 61 2012_10_28_19
2 61 2012_10_28_19
3 63 2012_10_28_19
4 63 2012_10_28_20
5 10_61 2012_10_28_20
6 61 2012_10_28_20
7 61 2012_10_28_20
8 61 2012_10_28_21
9 61 2012_10_28_21
10 10_65 2012_10_28_21
11 10_63 2012_10_28_21
12 10_63 2012_10_28_22
13 61 2012_10_28_22
14 63 2012_10_28_22
15 61 2012_10_28_22
16 61 2012_10_28_22
17 61 2012_10_28_23
18 61 2012_10_28_23
19 10_61 2012_10_28_23
20 10_61 2012_10_28_23
我希望最终得到这个:
mCodes datetime
1 61_63 2012_10_28_19
2 10_61_63 2012_10_28_20
3 10_61_65 2012_10_28_21
4 10_61_63 2012_10_28_22
5 10_61 2012_10_28_23
我知道这对于for循环是可行的,但问题是,这是一个更大的数据集的一部分,并且for循环效率非常低。非常感谢任何帮助!
答案 0 :(得分:1)
您可以使用aggregate
:
aggregate(mCodes ~ datetime, data=unique(dat, MARGIN=1),
function(z) {
paste(sort(ifelse(grepl('_',z), unlist(strsplit(as.character(z),'_')), z)), collapse='_')
})
结果:
datetime mCodes
1 2012_10_28_19 61_63
2 2012_10_28_20 10_61_63
3 2012_10_28_21 10_61_65
4 2012_10_28_22 10_61_63
5 2012_10_28_23 10_61
您的数据,正如我在以下处读到的那样:
dat <- read.table(text=' mCodes datetime
1 61 2012_10_28_19
2 61 2012_10_28_19
3 63 2012_10_28_19
4 63 2012_10_28_20
5 10_61 2012_10_28_20
6 61 2012_10_28_20
7 61 2012_10_28_20
8 61 2012_10_28_21
9 61 2012_10_28_21
10 10_65 2012_10_28_21
11 10_63 2012_10_28_21
12 10_63 2012_10_28_22
13 61 2012_10_28_22
14 63 2012_10_28_22
15 61 2012_10_28_22
16 61 2012_10_28_22
17 61 2012_10_28_23
18 61 2012_10_28_23
19 10_61 2012_10_28_23
20 10_61 2012_10_28_23', header=TRUE, stringsAsFactors=FALSE)
答案 1 :(得分:1)
这是一个data.table
解决方案,专为大型数据集而设计。
说df
是您的数据集
library(data.table)
setDT(df)[, list(mCodes = paste(sort(unique(unlist(strsplit(unique(mCodes), "_")))), collapse = "_")), by = datetime]
## datetime mCodes
## 1: 2012_10_28_19 61_63
## 2: 2012_10_28_20 10_61_63
## 3: 2012_10_28_21 10_61_63_65
## 4: 2012_10_28_22 10_61_63
## 5: 2012_10_28_23 10_61
我唯一能够理解的是,为什么63
日期中没有2012_10_28_21
您想要的输出?我不明白为什么你决定把它拿出来