我想要做的是制作一个列表,然后从该列表的部分元素中创建一个列表。我可以使用子集然后使用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 中仅访问区域并从中创建单独的列表对象?
答案 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
。