我有一个列表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"参考。非常感谢。