如果有人能帮忙完成下面的任务,我真的很感激。我搜索了R主题,但没有找到任何具体解决这个问题。我也尝试了哪种表,但没有真正随处可见。
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
(即 B
中给出的名称编号/顺序,从x_2
构造一个新的数据框。新数据框将包含x_2
中的名称以及y_1
中每个类别中的最早日期(例如"B10"
类A
中最早的日期{ {1}},等。)这样我最终会得到一个新的数据框2004-10-20
,如下所示:
A2
我的目的是从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 )
中减去A2
中的日期,以获得以天为单位的持续时间数字。以上是我的真实数据的一个非常简化的版本。我正在处理的数据大约有3000行。
非常感谢任何帮助,如果有任何需要澄清,请告诉我。我在MAC中使用的是版本2.15.2。
由于
答案 0 :(得分: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
答案 1 :(得分:2)
以下是创建A2
的一种方式:
C <- A[order(A$x_1,A$y_1),]
A2 <- C[match(B$x_2,C$x_1),]
使用order()
将确保最早的日期是第一个。使用match()
匹配变量的第一次出现,因此它只会获取最早的日期。
答案 2 :(得分: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