R中数据框中特定列中的状态计数

时间:2014-01-02 10:03:37

标签: r coding-style aggregation lapply sapply

我有一个数据框 - > “测试”

> test
     V1 V2
1 INS01  1
2 INS01  1
3 INS02  1
4 INS03  2
5 INS03  3
6 INS04  4
> class(test)
[1] "data.frame"

我想要一个“INS01”,“INS02”,“INS03”,“INS04”。我尝试使用“by”但它没有给我所需的输出。

> agg <- by(test, test$V1, function(x) length(x))
> agg
test$V1: INS01
[1] 2
------------------------------------------------------------ 
test$V1: INS02
[1] 2
------------------------------------------------------------ 
test$V1: INS03
[1] 2
------------------------------------------------------------ 
test$V1: INS04
[1] 2

我被困在这里。任何帮助表示赞赏。感谢

3 个答案:

答案 0 :(得分:2)

使用table()

让我们制作测试数据框(请在下一个问题中提供类似的代码,请参阅here

zz <- textConnection("
V1 V2
1 INS01  1
2 INS01  1
3 INS02  1
4 INS03  2
5 INS03  3
6 INS04  4
")
Data <- read.table(zz)

然后:

> table(Data$V1)

INS01 INS02 INS03 INS04 
    2     1     2     1 

答案 1 :(得分:1)

将列V1转换为factor并使用默认的factor summary方法,该方法会返回频率。

> summary(as.factor(test$V1))
INS01 INS02 INS03 INS04
    2     1     2     1

答案 2 :(得分:1)

Joris分享我这样做的方式,但我想我会分享为什么你的答案是错的:

length上使用data.frame会告诉您data.frame中有多少列,而不是结果行数(这是您实际执行的内容)。

示例:

x <- data.frame(matrix(1:100, ncol = 25))
length(x)
# [1] 25

如果您想使用by,请改为使用nrow

by(test, test$V1, function(x) nrow(x))
# test$V1: INS01
# [1] 2
# --------------------------------------------------------------------------- 
# test$V1: INS02
# [1] 1
# --------------------------------------------------------------------------- 
# test$V1: INS03
# [1] 2
# --------------------------------------------------------------------------- 
# test$V1: INS04
# [1] 1