列出列表子元素中的对象

时间:2014-01-28 14:27:23

标签: r plyr

我想要做的是制作一个列表,然后从该列表的部分元素中创建一个列表。我可以使用子集然后使用dlply分两步完成,但我想知道是否有更快的方法使用任何XXply方法。

所以我有一个数据框:

data <- data.frame(
    biz = sample(c("telco","shipping","tech"), 50, replace = TRUE),
    region = sample(c("mideast","americas","asia"), 50, replace = TRUE),
    date = rep(seq(as.Date("2010-02-01"), length=10, by = "1 day"),5),
    revenue = sample(500:1000,50,replace=T),
    orders = sample(0:2,50,replace=T)
)

最终,我在这里寻找的是:对于每个地区,按业务组织的身份值列表。

凌乱的方法是为每个区域选择一个子集,然后将其转换为列表:

mideast <- subset(data, region == "mideast")
americas <- subset(data, region == "americas")
asia <- subset(data, region == "asia")

mideast.list <- dlply(mideast, .(biz), identity)
americas.list <- dlply(americas, .(biz), identity)
asia.list <- dlply(asia, .(biz), identity)

足够简单,但是使用更大的数据集会变得难以处理。

如果我在原始数据上使用 dlply ,它会为我提供我正在寻找的值,但同样,我希望每个区域都有实际的列表对象。所以:

list2 <- dlply(data, .(region, biz), identity)

但是,如何从 list2 中仅访问区域并从中创建单独的列表对象?

1 个答案:

答案 0 :(得分:1)

我不是100%清楚我明白你想要做什么,但也许这就是它?

lst <- lapply(
  split(data, data$region), 
  function(df) lapply(split(df, df$biz), identity)
)
lst[["americas"]][["shipping"]]
#         biz   region       date revenue orders
# 3  shipping americas 2010-02-03     621      2
# 23 shipping americas 2010-02-03     799      2
# 33 shipping americas 2010-02-03     920      0
# 34 shipping americas 2010-02-04     705      2

这符合americas.list的结构,因此我认为这是您尝试做的事情。另请注意,如果lapply实际上是您要应用的功能(identity单独执行您需要的功能),则可以跳过内部split