在R中操纵数据帧

时间:2013-11-12 15:26:57

标签: r dataframe

如果有人能帮忙完成下面的任务,我真的很感激。我搜索了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)

AB是我正在使用的两个数据框架。我需要使用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。

由于

3 个答案:

答案 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