列表中的嵌套lapply()?

Sav*_*SUS 4 r function lapply

我有一个列表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))
Run Code Online (Sandbox Code Playgroud)

我想做两件事:

第一

我想知道每个数字在整个列表中出现的次数,我希望每个结果都是一个向量(或任何可以让我以后用结果执行计算的形式):

代码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
Run Code Online (Sandbox Code Playgroud)

无论如何都不使用该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)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但我没有工作.我实际上不明白结果.

> 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
Run Code Online (Sandbox Code Playgroud)

第二

现在,我想得到每个数字出现在列表中的次数,但现在在每个元素中$a,$b$c.我想过使用lapply()但我不知道究竟是怎么回事.以下是我尝试过的,但它与Code 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))
Run Code Online (Sandbox Code Playgroud)

我用这5行代码得到的是5个3个元素的列表,每个元素包含一个数字值.例如,第二行代码告诉我2在每个元素中出现的次数l.

代码3:

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

$a
[1] 1

$b
[1] 1

$c
[1] 1
Run Code Online (Sandbox Code Playgroud)

我想要获得的是一个包含三个元素的列表,其中包含我要查找的所有信息.

请在答案中使用参考"代码1","代码2"和"代码3".非常感谢你.

42-*_*42- 9

只是as.data.frame(l)用于第二部分和table(unlist(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`
Run Code Online (Sandbox Code Playgroud)


jos*_*ber 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
Run Code Online (Sandbox Code Playgroud)

对于代码 3,如果您想获得列表 a、b 和 c 的计数,您可以使用以下函数将频率函数应用于列表的每个元素lapply

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
Run Code Online (Sandbox Code Playgroud)