R 使用循环提取一系列整数
我有一些数据,我想提取整数出现的频率。以下是一些示例数据:R 使用循环提取一系列整数,r,loops,multiple-columns,R,Loops,Multiple Columns,我有一些数据,我想提取整数出现的频率。以下是一些示例数据: df <- read.table(header=T, text="A B C D 1 1 5 3 1 2 1 2 3 2 3 2 3 5 3 4 1 4 5
df <- read.table(header=T, text="A B C D
1 1 5 3 1
2 1 2 3 2
3 2 3 5 3
4 1 4 5 3
5 3 1 4 2
6 5 2 5 1
")
df
但每次我尝试存储输出时,都会出现一个错误。在数据帧中存储结果输出的最简单方法是什么?我想我对通过循环存储数据的方式感到困惑。谢谢你的帮助 我们可以使用
mtabulate
library(qdapTools)
t(mtabulate(df))
# A B C D
#1 3 1 0 2
#2 1 2 0 2
#3 1 1 2 2
#4 0 1 1 0
#5 1 1 3 0
在
base R
中,我们还可以取消数据集的列表,复制列名,并使用表
(不使用任何循环、显式(for
)或隐式(lappy
)
或者正如@nicola提到的,我们可以使用rep
(应该更快)来代替col(df)
我们可以使用mtabulate
library(qdapTools)
t(mtabulate(df))
# A B C D
#1 3 1 0 2
#2 1 2 0 2
#3 1 1 2 2
#4 0 1 1 0
#5 1 1 3 0
在base R
中,我们还可以取消数据集的列表,复制列名,并使用表
(不使用任何循环、显式(for
)或隐式(lappy
)
或者正如@nicola提到的,我们可以使用rep
(应该更快)来代替col(df)
与@akrun不同,我更喜欢在可能的情况下使用base R
out <- matrix(0, nrow= 6, ncol=4, dimnames= list(1:6, LETTERS[1:4]))
for (i in 1:6) {
out[i,] <- unlist(lapply(df, function(j) sum(j == i)))
}
R> out
A B C D
1 3 1 0 2
2 1 2 0 2
3 1 1 2 2
4 0 1 1 0
5 1 1 3 0
6 0 0 0 0
out与@akrun不同,我更喜欢在可能的情况下使用base R
out <- matrix(0, nrow= 6, ncol=4, dimnames= list(1:6, LETTERS[1:4]))
for (i in 1:6) {
out[i,] <- unlist(lapply(df, function(j) sum(j == i)))
}
R> out
A B C D
1 3 1 0 2
2 1 2 0 2
3 1 1 2 2
4 0 1 1 0
5 1 1 3 0
6 0 0 0 0
out我们也可以在base-R中执行此操作,而无需for循环:
do.call(cbind, lapply(df, function(x){table(factor(x,levels=1:6))}))
A B C D
1 3 1 0 2
2 1 2 0 2
3 1 1 2 2
4 0 1 1 0
5 1 1 3 0
6 0 0 0 0
我们也可以在base-R中执行此操作,而无需for循环:
do.call(cbind, lapply(df, function(x){table(factor(x,levels=1:6))}))
A B C D
1 3 1 0 2
2 1 2 0 2
3 1 1 2 2
4 0 1 1 0
5 1 1 3 0
6 0 0 0 0
还有一个选择:
library(reshape2)
table(melt(df))
#No id variables; using all as measure variables
# value
#variable 1 2 3 4 5
# A 3 1 1 0 1
# B 1 2 1 1 1
# C 0 0 2 1 3
# D 2 2 2 0 0
还有一个选择:
library(reshape2)
table(melt(df))
#No id variables; using all as measure variables
# value
#variable 1 2 3 4 5
# A 3 1 1 0 1
# B 1 2 1 1 1
# C 0 0 2 1 3
# D 2 2 2 0 0
基于此输入,您期望的输出是什么?大多数情况下,for循环不是一种方式。您是如何存储输出的?@Heroka期望的输出已经通过OPFor每个列标题显示出来的。我希望能够清楚地看到有多少次是1、2等。基于此输入,您期望的输出是什么?for循环不是大部分时间都很顺利。你是如何存储输出的?@Heroka期望的输出已经通过OPFor每个列标题显示出来了。我希望能够清楚地看到有多少次是1、2等。所以我想你的答案解决了我的困惑。我需要在j中使用单独的索引,我想我在尝试中使用了两次I作为索引。非常感谢。我同意base-R。但是,在这种情况下,为什么不使用表
而不是for循环?@Heroka我个人倾向于在可能的情况下使用语言不可知的工具。这与使用base-R的理念类似。是的,我认识到这不是一个纯粹的语言不可知的解决方案(lappy
,unlist
)但这些只是数据结构构造。需要注意的是,我得到了错误error in out[I,]我认为这是一个复制粘贴错误,我将矩阵赋值添加到了out
。因此我认为你的答案解决了我的困惑。我需要在j中使用一个单独的索引,我想我在尝试中使用了两次I作为索引。非常感谢。我同意base-R。但是,在这种情况下,为什么不使用表而不是for循环?@Heroka I如果可能的话,我个人倾向于使用语言不可知工具。这与使用base R的理念类似……是的,我认识到这不是一个纯粹的语言不可知解决方案(lappy
,unlist
),但这些只是数据结构构造。需要注意的是,我得到了错误error in out[I,]我认为这是一个复制粘贴错误,我将矩阵赋值添加到out
+1,但是,正如你所知,lappy是一个循环的包装器。所以我不确定我会称之为没有循环的解决方案。但是你说得对,没有for
循环;-)我知道。但是对我来说,lappy(df,
比for更优雅(i in 1:ncol(df))
。R的乐趣,100种方法达到相同的结果:)我同意。lappy更好。我认为级别应该是1:5(6是帖子中的行号)你是对的。然而,在这个问题的早期版本中,它是1:6,所以我假设这是可能出现的数字。+1但是,好吧,Lappy是循环的包装器,正如你所知道的。所以我不确定我会称之为没有循环的解决方案。但是你说得对,没有for
循环;-)我知道。但是对我来说,Lappy(df,
比(i in 1:ncol(df))
优雅得多。R的乐趣,100种方法达到相同的结果:)我同意。lappy更好。我认为级别应该是1:5(6是帖子中的行号)你是对的。但是,在问题的早期版本中是1:6
,所以我假设这是可能出现的数字。很好的解决方案。在base
中,我更喜欢rep(name(df),each=nrow(df))
(而不是name(df)[col col(df)]
,但我知道你很喜欢row
和col
)@nicola感谢您的反馈。我认为rep
应该更快。很棒的解决方案。在base
中,我更喜欢rep(names(df),each=nrow(df))
(而不是names(df)[col col(df)]
,但我知道您非常喜欢row
和col
)@nicola感谢您的反馈。我认为代表应该更快。