我有一个包含很多行的矩阵,让我们说每个类别超过5000行,我想从每个类别获得4500行。怎么在R?
我知道有独特之处,但每个类别只需要一个元素,但每个类别需要N个元素。
这是我的数据:
cat f1 f2 f3
1 a 15 20 sdr
2 b 8 6 zrf
3 a 54 6 sf
4 c 32 8 azr
5 b 65 98 arfg
....
答案 0 :(得分:4)
一种“强力”方法是按组拆分数据,然后简单地取SELECT
*, customer_email, SUM(qty_invoiced) AS total_cases_invoiced
FROM
mg_sales_flat_order_item
JOIN
mg_sales_flat_order ON mg_sales_flat_order.entity_id = mg_sales_flat_order_item.order_id
WHERE
(mg_sales_flat_order_item.sku LIKE '%A'
OR mg_sales_flat_order_item.sku LIKE '%F'
OR mg_sales_flat_order_item.sku LIKE '%B'
OR mg_sales_flat_order_item.sku LIKE '%C'
OR mg_sales_flat_order_item.sku LIKE '%FP'
OR mg_sales_flat_order_item.sku LIKE '%AP')
AND row_total != 0
GROUP BY (order_id,customer_email)
HAVING SUM(qty_invoiced) >= 4
ORDER BY customer_email DESC
行head
行。然后只需将它们全部绑定到新的N
即可。这是'split-apply-combine'的精髓。
data.frame
如果您的数据位于df <- data.frame(group=rep(c("A","B"), each=10), var=rnorm(20))
# Number of Rows
N <- 5
# the split, apply(i.e. head), combine approach
do.call("rbind", lapply(split(df, f=df$group), function(x) head(x, n=N)))
,其中的列包含某种唯一的组标识符,并且您直接调用matrix
,则相同的方法也可以使用。它仍然会将矩阵拆分为“子”矩阵列表。
split.data.frame
修改强>
根据以下@akrun的建议,如果您的对象是mat <- matrix(c(rep(c(0,1), each=10), rnorm(20)),20,2)
do.call("rbind", lapply(split.data.frame(mat, f=mat[,1]), function(x) head(x, n=N)))
dplyr
data.frame