使用lapply根据条件创建列表的子集以创建新列表并保留元素名称

罗弗先生

我有20个列表,在20个列表中有一个按市值排名的大约200股列表。从2008年到2018年,每6个月进行一次分类,因此共有20个列表。我将股票分为5个市值投资组合。我使用lapply编写了代码,该代码按市值提取了20%的股份,并列出了五个不同的列表。我的问题是新列表没有元素名称。由于每个列表都是一个列表,其中包含20个列表,每个列表大约有50个份额,因此我无法手动命名它们。我需要一种将每个列表中的值与原始列表进行匹配以获取名称的方法。股份名称就是我所需要的;名称最初是数据框的行名。或者,有没有更好的方法来保留名称?我提供了一个包含2的列表的示例,该列表的嵌套列表为100,并说明了我遇到的相同问题。

z <- as.double(1:100)
x <- as.double(200:299)
a <- do.call(paste0, replicate(5, sample(LETTERS, 100, TRUE), FALSE))
b <- do.call(paste0, replicate(6, sample(LETTERS, 100, TRUE), FALSE))
z <- as.matrix(z)
x <- as.matrix(x)
rownames(z) <- a
rownames(x) <- b

mylist <- list(z, x)

portfolio_5 <- lapply(mylist, function(x) x[x <= quantile(x, 0.2)])

portfolio_4 <- lapply(mylist, function(x) x[x > quantile(x, 0.2) & x <= quantile(x, 0.4)])

portfolio_3 <- lapply(mylist, function(x) x[x > quantile(x, 0.4) & x <= quantile(x, 0.6)])

portfolio_2 <- lapply(mylist, function(x) x[x > quantile(x, 0.6) & x <= quantile(x, 0.8)])

portfolio_1 <- lapply(mylist, function(x) x[x > quantile(x, 0.8) & x <= quantile(x, 1)])

上面的代码有效,但是您会注意到每个列表中元素的名称已被删除。这是我同样的问题。如何执行上述操作,并仍然保留每个权益的名称?

阿克伦

由于它仅是一列,因此我们需要使用,drop = FALSE因为?Extract

x [i,j,...,drop = TRUE]

drop-用于矩阵和数组。如果为TRUE,则结果强制为最小尺寸(请参见示例)

OPlistlist具有行名的列矩阵a如果i未提供索引,则将其matrix强制vectorvector具有dim属性的a。因此,请在中指定逻辑索引i,将保留j为空白(以选择所有列),然后添加drop = FALSE

lapply(mylist, function(x) x[x <= quantile(x, 0.2),, drop = FALSE])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章