Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用循环提取一系列整数_R_Loops_Multiple Columns - Fatal编程技术网

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感谢您的反馈。我认为
代表应该更快。