0

我在处理 R 中的某些数据时遇到问题。我有一个包含信息的数据框。与客户交易有关。我提取最小日期如下,

hold <- (lapply(with(train_train, split(date,id)),min)) # minimum date

给我以下清单:

head(hold)

#$`15994113`
#[1] "2012-03-02"
#
#$`16203579`
#[1] "2012-03-02"
#
#$`17472223`
#[1] "2012-03-22"

然后我想要做的是获取为每个 id 返回的日期,并将其合并回包含每个 id 的其他相关变量的数据框。我试图这样做;

hold <- as.data.frame(unlist(hold))
hold <- as.data.frame(cbind(row.names(hold),hold[,1]))
names(hold) <- c('id', 'mindate')
transactions.temp <- merge(x = transactions.pro, y = hold, by = 'id')

但是,绑定破坏了日期格式,我无法弄清楚如何获得“id”“mindate”的数据结构,这将使我能够将其合并到我的主数据集中,如下所示;

> head(transactions.pro)
           id totaltransactions totalspend        meanspend
1:  100007447              1096    6644.88 6.06284671532847
2:  100017875               348     992.29 2.85140804597701
3:  100051423               646    2771.43 4.29013931888545
4: 1000714152              2370   10509.08 4.43421097046414
5: 1002116097              1233    4158.51 3.37267639902676
6: 1004404618               754    2978.15 3.94980106100796

您提供的任何建议将不胜感激。谢谢!

4

2 回答 2

1

cbind正在将您的日期隐式转换为character因为row.names. 使用 for 的data.frame方法cbind来实现这一点。基本上替换:

as.data.frame(cbind(row.names(hold),hold[,1]))

cbind.data.frame(row.names(hold), hold[,1])
于 2014-06-15T12:11:02.203 回答
1

您可以尝试使用不同的方法dplyr,您不会首先转换为列表,而是将mindates 保留为 data.frame,然后left_join(= mergewith all.x=TRUE)将其保存到transactions.prodata.frame。由于没有可重现的示例,我没有对其进行测试。

require(dplyr)

train_train %>%
  mutate(date = as.Date(as.character(date))) %>%
  group_by(id) %>%
  summarize(mindate = min(date)) %>%
  left_join(transactions.pro, ., by = "id")
于 2014-06-15T11:35:05.370 回答