从子集中选择观察值以基于 R 中的大型数据框创建新子集

Posted

技术标签:

【中文标题】从子集中选择观察值以基于 R 中的大型数据框创建新子集【英文标题】:Select observations from a subset to create a new subset based on a large dataframe in R 【发布时间】:2012-07-17 14:36:08 【问题描述】:

我有一个包含许多列和行的数据集 (Purchase.df)。这个问题的重要变量名称是“Customer”、“OrderDate”、“DateRank”(对日期进行排序以便我可以找到最小的日期)和“BrandName”。以下是我正在使用的一个非常小的示例:(我是这个网站的新手,所以我希望我在下面粘贴的内容有效)

Purchase.df<-structure(list(Customer = c(10071535L, 10071535L, 10071535L, 
10071535L, 10071535L, 10071535L, 10071711L, 10071711L, 10071711L, 
10071711L, 10071711L, 10071711L, 10071711L, 10071711L, 10071711L, 
10071711L, 10071711L, 10071711L, 10072059L, 10072059L, 10072059L, 
10072113L, 10072113L, 10072113L, 10072113L, 10072113L, 10072113L, 
10072113L), BrandName = structure(c(1L, 2L, 2L, 2L, 3L, 3L, 2L, 
2L, 2L, 2L, 3L, 3L, 1L, 3L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("X", "Y", "Z"), class = "factor"), 
OrderDate = structure(c(14L, 14L, 15L, 16L, 19L, 20L, 11L, 
18L, 5L, 6L, 1L, 17L, 21L, 22L, 23L, 8L, 10L, 13L, 7L, 9L, 
12L, 4L, 4L, 2L, 2L, 2L, 3L, 3L), .Label = c("1/17/2011 0:00", 
"1/19/2010 0:00", "1/25/2010 0:00", "1/4/2010 0:00", "10/22/2010 0:00", 
"11/15/2010 0:00", "11/23/2011 0:00", "12/14/2011 0:00", 
"12/16/2011 0:00", "2/7/2012 0:00", "3/16/2010 0:00", "3/21/2012 0:00", 
"4/16/2012 0:00", "4/27/2012 0:00", "5/16/2012 0:00", "5/30/2012 0:00", 
"5/5/2011 0:00", "6/1/2010 0:00", "6/12/2012 0:00", "7/3/2012 0:00", 
"8/1/2011 0:00", "8/16/2011 0:00", "9/19/2011 0:00"), class = "factor"), 
DateRank = c(18.5, 18.5, 20, 21, 24, 25, 15, 23, 9, 10, 1, 
22, 26, 27, 28, 12, 14, 17, 11, 13, 16, 7.5, 7.5, 3, 3, 3, 
5.5, 5.5)), .Names = c("Customer", "BrandName", "OrderDate", 
"DateRank"), row.names = c(NA, -28L), class = "data.frame")

我创建了这个大型数据集 (subset.df) 的一个子集,它为每个客户找到了第一个 OrderDate,并告诉我他们购买了哪个品牌。我使用以下代码来执行此操作:

subset1<-split(Purchase.df,Purchase.df$Customer)
subset2<-lapply(split(Purchase.df,Purchase.df$Customer), function(chunk) chunk[which(chunk$DateRank==min(chunk$DateRank)),])
subset.df<-do.call(rbind, as.list(subset2))

现在,我想弄清楚哪些客户在第一个 OrderDate 订购了品牌 X,并创建一个新数据集 (BigSubset.df),其中包含在第一个订购日期购买品牌 X 的客户的所有 OrderDates。

应该是这样的:

Customer    BrandName   OrderDate   DateRank
10071535    X   4/27/2012 0:00  18.5
10071535    Y   4/27/2012 0:00  18.5
10071535    Y   5/16/2012 0:00  20
10071535    Y   5/30/2012 0:00  21
10071535    Z   6/12/2012 0:00  24
10071535    Z   7/3/2012 0:00   25
10072059    X   11/23/2011 0:00 11
10072059    X   12/16/2011 0:00 13
10072059    X   3/21/2012 0:00  16
10072113    X   1/4/2010 0:00   7.5
10072113    Y   1/4/2010 0:00   7.5
10072113    Y   1/19/2010 0:00  3
10072113    Z   1/19/2010 0:00  3
10072113    Z   1/19/2010 0:00  3
10072113    Z   1/25/2010 0:00  5.5
10072113    Z   1/25/2010 0:00  5.5

当我尝试从 Purchase.df 创建 BigSubset.df 时,我似乎无法让 R 引用较小的数据集,因为行数不相等。我在 Google 上搜索并没有看到任何答案,所以我什至不确定这在 R 中是否可行。让我知道你的想法。

【问题讨论】:

欢迎。建议:how to make a great reproducible example 谢谢。我已更新问题以包含此建议。 +1 现在看起来是个不错的问题,尽管不是微不足道的。我相信R可以做到这一点。如果您没有得到答案,请考虑提供赏金。祝你好运。 哈哈谢谢!我真的很希望它不会归结为那个! 【参考方案1】:

也许我理解错了,但我相信这是可行的:

Xfirst <- as.vector(subset.df[subset.df$BrandName == "X", ])$Customer
BigSubset.df <- Purchase.df[Purchase.df$Customer %in% Xfirst, ]

我认为您的 daterank 可能存在错误,因为在您的示例中,客户 10072113 的日期为 2010 年 1 月 19 日排名第 3,但较早的 2010 年 1 月 4 日排名为 7.5。 (旁注,在您的chunk 函数中,您可以使用which.min(chunk$DateRank) 而不是which(chunk$DateRank==min(chunk$DateRank)),我认为这更有效。)

【讨论】:

你是天赐良机!!太感谢了!我不能使用 which.min(chunk$DateRank) 因为我需要第一个订单日期的所有订单,而不仅仅是那个命令似乎给出的订单。也感谢您指出 DateRank 的问题。我也能解决这个问题。

以上是关于从子集中选择观察值以基于 R 中的大型数据框创建新子集的主要内容,如果未能解决你的问题,请参考以下文章

R:从R中的大型数据集中根据列中的值删除行[重复]

R中大型数据集中多个列的自动grep()

如何使用 R 中 gplot() 包中的 plotmean() 函数使用 paste0() 操作 n.label 值以获得观察次数

从列表中提取值以将它们分配为 R 中的新变量

MS ACCESS 2007 - 从子表单中的组合框中选择值会创建重复值

基于R中大型数据集中没有足够的重复数据删除行