R整合数据帧

时间:2014-05-05 17:00:49

标签: r

我有一个如下所示的数据框:

        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循环效率非常低。非常感谢任何帮助!

2 个答案:

答案 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您想要的输出?我不明白为什么你决定把它拿出来