R 跨列获取前5个值的列共享

R 跨列获取前5个值的列共享,r,R,我将以下数据存储在列表中: set.seed = 12345 df1 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE))) df2 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE))) list = list(df1, df2) 我怎样才能做到以下几点: 1) 对于每列,获取列总和中每个元素的份额(即,每个元素除以列总和) 2) 对于每列,仅取前5个值的这些份额之和(其中前5个值

我将以下数据存储在列表中:

set.seed = 12345
df1 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE)))
df2 = data.frame(replicate(10,sample(0:500,1000,rep=TRUE)))
list = list(df1, df2)
我怎样才能做到以下几点:

1) 对于每列,获取列总和中每个元素的份额(即,每个元素除以列总和) 2) 对于每列,仅取前5个值的这些份额之和(其中前5个值的顺序在各列中不同)

然后,输出将是2个向量的列表(df1和df2各一个),每个向量包含10个共享


我想使用apply家族来完成这项任务。不过,任何建议都是欢迎的。非常感谢

我们可以使用
lapply
循环查看
列表,将数据集除以每列的列和('x1'),通过循环(
sapply
)每列选择前5位,
对其排序,并获得
标题
,然后
cbind
列出
元素以创建包含两列的数据集

do.call(cbind,lapply(list, function(x) {
   x1 <- x/colSums(x)[col(x)]
   sapply(x1, function(y) sum(head(sort(y, decreasing = TRUE), 5)))}))

谢谢这很有效。根据你的第一个建议,[col(x)]做什么?@nymuffin在我们做之前,通过复制使长度相同
/
谢谢@akrun。非常清楚,如果我们不包括[col(x)],df1的第1列会发生什么?我正在查看删除[col(x)]后的结果,不清楚这说明了什么me@nymuffin将要发生的是,它将第1列的第一个元素除以第一个colSums,然后第2个colSums除以第二个colSums,而不是将整个第1列除以第一列的整个colSums。非常感谢,你太棒了
library(tidyverse)
map(list, ~ .x %>% 
               summarise_all(funs(sum(tail(sort(./sum(.)), 5)))) %>% 
               unlist %>%
               as_tibble) %>%
   bind_cols