我将下列数据存储在一个列表中:
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)对于每一列,为每一列获取每个元素在列和(即每个元素除以列总数)中所占的份额,只对前5个值取这些份额的总和(其中这些前5个值的顺序将在各列之间不同)。
然后,输出将是一个由两个向量组成的列表( df1和df2各一个),每个向量包含10个共享。
我想使用应用程序家族来完成这个任务。不过,欢迎提出任何建议。事先非常感谢!
发布于 2018-05-13 08:21:05
我们可以使用list
循环lapply
,将数据集除以每列的列和('x1'),通过循环(sapply
)在每一列中选择前5,并获得head
,然后用cbind
list
元素创建两个列的数据集。
do.call(cbind,lapply(list, function(x) {
x1 <- x/colSums(x)[col(x)]
sapply(x1, function(y) sum(head(sort(y, decreasing = TRUE), 5)))}))
或使用tidyverse
library(tidyverse)
map(list, ~ .x %>%
summarise_all(funs(sum(tail(sort(./sum(.)), 5)))) %>%
unlist %>%
as_tibble) %>%
bind_cols
https://stackoverflow.com/questions/50318151
复制相似问题