2

如果有人可以帮助完成以下任务,我将不胜感激。我搜索了 R 主题,但没有找到任何专门解决此问题的内容。我也试过 which, table 但并没有真正得到它。

x_1 <- c("A1", "A1", "B10", "B10", "B10", "C100", "C100", "C100")
y_1 <- as.Date(c("2010-11-17", "2010-11-17", "2010-11-17", "2009-02-14",
                 "2004-10-20", "2008-03-21", "2010-09-30", "2004-06-22"))
A <- data.frame(x_1, y_1)

x_2 <- c("A1", "B10", "B10", "B10","B10", "C100", "C100", "C100")
y_2 <- as.Date(c("2013-07-23", "2012-01-01", "2011-08-29", "2011-10-20",
                 "2010-08-10", "2012-06-21", "2013-08-27", "2012-11-25"))
B <- data.frame(x_2, y_2)

A并且B是我正在使用的两个数据框。我需要使用(A中给出的名称编号/顺序来构造一个新的数据框。新的数据框将包含 in 中的名称以及每个类别中的最早日期 from (例如,类别中的最早日期 from is等),因此我最终得到一个新的数据框,如下所示:B x_2x_2y_1"B10"A2004-10-20A2

x_3 <- c("A1", "B10", "B10", "B10", "B10", "C100", "C100", "C100")
y_3 <- as.Date(c("2010-11-17","2004-10-20", "2004-10-20", "2004-10-20",
                 "2004-10-20","2004-06-22", "2004-06-22", "2004-06-22" ) )
A2 <- data.frame(x_3, y_3 )

我的意图是从中减去日期A2B获得持续时间(以天为单位)的数字。以上是我真实数据的一个非常简化的版本。我正在处理的数据大约是 3000 行。

任何帮助将不胜感激,如果有任何需要澄清的地方,请告诉我。我在 MAC 中使用 R 的 2.15.2 版本。

谢谢

4

3 回答 3

2

使用data.table包,这是微不足道的。

library(data.table)
A <- data.table(A)
B <- data.table(B)
setkey(B, x_1)

firsts <- A[, head(sort(y_1), 1), keyby=x_1]

将两者合并在一起:

B[firsts]

#     x_2        y_2         V1
# 1:   A1 2013-07-23 2010-11-17
# 2:  B10 2012-01-01 2004-10-20
# 3:  B10 2011-08-29 2004-10-20
# 4:  B10 2011-10-20 2004-10-20
# 5:  B10 2010-08-10 2004-10-20
# 6: C100 2012-06-21 2004-06-22
# 7: C100 2013-08-27 2004-06-22
# 8: C100 2012-11-25 2004-06-22
于 2013-11-12T15:42:26.787 回答
2

这是创建您的一种方法A2

C <- A[order(A$x_1,A$y_1),]
A2 <- C[match(B$x_2,C$x_1),]

使用order()将确保最早的日期是第一个。Usingmatch()匹配变量的第一次出现,因此它只会选择最旧的日期。

于 2013-11-12T15:50:53.547 回答
1

我认为只需使用聚合获得 A 中每个的最小值就足够了,然后使用 B 来选择所需的行。

aggregate(A["y_1"], A["x_1"], min)[B$x_2,]

##      x_1        y_1
## 1     A1 2010-11-17
## 2    B10 2004-10-20
## 2.1  B10 2004-10-20
## 2.2  B10 2004-10-20
## 2.3  B10 2004-10-20
## 3   C100 2004-06-22
## 3.1 C100 2004-06-22
## 3.2 C100 2004-06-22
于 2013-11-12T15:49:41.543 回答