使用循环提取一系列整数

时间:2016-02-23 16:27:44

标签: 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         3  
5          3         1          4         2  
6          5         2          5         1 
") 
df

我可以循环使用这些并获得如下计数:

for (i in 1:5){ 
 print(colSums(df==i))
}

但每次我尝试存储输出时都会出错。将结果输出存储在数据帧中的最佳方法是什么?我认为我对存储数据的方式感到困惑。谢谢你的帮助。

4 个答案:

答案 0 :(得分:4)

我们可以使用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中,我们还可以unlist数据集,复制列名称,并使用table(不使用任何循环,显式(for)或隐式( lapply)。

table(unlist(df),names(df)[col(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

或者@nicola提到,我们可以使用col(df)代替rep(应该更快)

table(unlist(df), rep(names(df),each=nrow(df)))

答案 1 :(得分:1)

与@akrun不同,我更喜欢在可能的情况下使用基数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

答案 2 :(得分:1)

我们也可以在没有for循环的base-R中执行此操作:

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

答案 3 :(得分:1)

这是另一种选择:

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