簡體   English   中英

列表中的嵌套lapply()?

[英]Nested lapply() in a list?

我有一個列表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()但我不知道究竟是怎么回事。 以下是我嘗試過的,但它與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))

我用這5行代碼得到的是5個3個元素的列表,每個元素包含一個數字值。 例如,第二行代碼告訴我在l每個元素中出現了多少次數字2

代碼3:

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

$a
[1] 1

$b
[1] 1

$c
[1] 1

我想要獲得的是一個包含三個元素的列表,其中包含我要查找的所有信息。

請在答案中使用參考“代碼1”,“代碼2”和“代碼3”。 非常感謝你。

只需對第二部分使用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`

對於代碼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

對於代碼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

在這里你有另一個嵌套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)})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM