我有一个列表l
,它具有以下功能:
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个元素的列表,每个元素包含一个数字值。例如,第二行代码告诉我2
的每个元素中出现l
次的次数。
代码3:
> lapply(l, function(x) sum(x == 2))
$a
[1] 1
$b
[1] 1
$c
[1] 1
我想获得的是一个包含三个元素的列表,其中包含我要查找的所有信息。
请在答案中使用参考“代码1”,“代码2”和“代码3”。非常感谢你。
答案 0 :(得分: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`
答案 1 :(得分:3)
对于代码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
答案 2 :(得分: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)})