我有一个数据框 - > “测试”
> 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
我被困在这里。任何帮助表示赞赏。感谢
答案 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