列表中的嵌套lapply()?

5

我有一个列表l,它具有以下特点:

  • 它有3个元素
  • 每个元素都是长度为5的数字向量
  • 每个向量包含数字1到5

l = list(a = c(2, 3, 1, 5, 1), b = c(4, 3, 3, 5, 2), c = c(5, 1, 3, 2, 4))

我希望做两件事:

第一件

我想知道整个列表中每个数字出现的次数,我希望每个结果都以向量形式呈现(或者任何形式,可以让我稍后对结果进行计算):

代码1:

> a <- table(sapply(l, "["))
> x <- as.data.frame(a)
> x

  Var1   Freq
1    1   3
2    2   3
3    3   4
4    4   2
5    5   3

有没有不使用table()函数的方法来完成它呢?我希望手动完成这个操作。我尝试在下面正确地执行。

代码2:(我知道这不是很有效率!)

x <- data.frame(
"1" <- sum(sapply(l, "[")) == 1
"2" <- sum(sapply(l, "[")) == 2
"3" <- sum(sapply(l, "[")) == 3
"4" <- sum(sapply(l, "[")) == 4
"5" <- sum(sapply(l, "[")) == 5)

我尝试了以下方法,但没有成功。实际上,我并不理解结果。

> sapply(l, "[") == 1:5        

     a     b     c
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE  TRUE  TRUE
[4,] FALSE FALSE FALSE
[5,] FALSE FALSE FALSE

> sum(sapply(l, "[") == 1:5)

[1] 2

第二步

现在,我想获得列表中每个数字出现的次数,但是现在是在每个元素$a$b$c中。我考虑使用lapply()函数,但我不知道具体怎么做。下面是我尝试过的方法,但它的效率就像代码2一样低效:

lapply(l, function(x) sum(x == 1))
lapply(l, function(x) sum(x == 2))
lapply(l, function(x) sum(x == 3))
lapply(l, function(x) sum(x == 4))
lapply(l, function(x) sum(x == 5))

使用这五行代码,我得到了五个包含单个数字值的三个元素列表。例如,第二行代码告诉我数字2 l 的每个元素中出现的次数。

代码3:

> lapply(l, function(x) sum(x == 2))

$a
[1] 1

$b
[1] 1

$c
[1] 1

我希望获得一个包含我需要的所有信息的三个元素列表。请在回答中使用"Code 1"、"Code 2" 和 "Code 3"参考。非常感谢。
3个回答

9

第一部分使用table(unlist(l)),第二部分使用as.data.frame(l)

> table(unlist(l))

1 2 3 4 5 
3 3 4 2 3 

> data.frame(lapply(l, tabulate))
  a b c
1 2 0 1
2 1 1 1
3 1 2 1
4 0 1 1
5 1 1 1`

5

对于代码1/2,您可以使用sapply来获取您想要的任何值的计数:

l = list(a = c(2, 3, 1, 5, 1), b = c(4, 3, 3, 5, 2), c = c(5, 1, 3, 2, 4))
data.frame(number = 1:5,
           freq = sapply(1:5, function(x) sum(unlist(l) == x)))
#   number freq
# 1      1    3
# 2      2    3
# 3      3    4
# 4      4    2
# 5      5    3

如果您想获取列表a、b和c的计数,针对代码3,您可以使用函数将您的频率函数应用于列表的每个元素:
freqs = lapply(l, function(y) sapply(1:5, function(x) sum(unlist(y) == x)))
data.frame(number = 1:5, a=freqs$a, b=freqs$b, c=freqs$c)
#   number a b c
# 1      1 2 0 1
# 2      2 1 1 1
# 3      3 1 2 1
# 4      4 0 1 1
# 5      5 1 1 1

2

这里有一个嵌套lapply()的另一个示例。

创建的数据:

list = NULL  
list[[1]] = c(1:5)  
list[[2]] = c(1:5)+3  
list[[2]] = c(1:5)+4  
list[[3]] = c(1:5)-1  
list[[4]] = c(1:5)*3  

list2 = NULL  
list2[[1]] = rep(1,5)  
list2[[2]] = rep(2,5)  
list2[[3]] = rep(0,5)  

这是结果;它用于将一个列表中的每个元素与另一个列表中的所有元素相减。
lapply(list, function(d){ lapply(list2, function(a,b) {a-b}, b=d)})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接