我有一个数据表,出于问题的目的可以简化为:
eg.ID <- rep(LETTERS[1:26], length.out=30)
eg.filter <- rep(0:1, length.out=30)
eg.df <- data.frame(eg.ID, eg.filter)
给出了:
> eg.df
eg.ID eg.filter
1 A 0
2 B 1
3 C 0
4 D 1
... ... ...
23 W 0
24 X 1
25 Y 0
26 Z 1
27 A 0
28 B 1
29 C 0
30 D 1
我想使用eg.filter列来忽略值为0的所有行,然后计算每个eg.ID发生的次数:
eg.df[eg.df$eg.filter==1,]$eg.ID
table(eg.df[eg.df$eg.filter==1,]$eg.ID)
我得到的初始输出符合预期:
> eg.df[eg.df$eg.filter==1,]$eg.ID
[1] B D F H J L N P R T V X Z B D
Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
只是eg.filter == 1的字母。
然而,我然后运行table()
> table(eg.df[eg.df$eg.filter==1,]$eg.ID)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 2 0 2 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
并且所有字母egfilter == 0重新出现(尽管正确计数为0)。我不想要它们。
我怀疑我对[]操作员有一个基本的误解,但是尽管拖网手册无法解决它的问题。帮助赞赏。感谢。
答案 0 :(得分:1)
我们可以使用droplevels
删除&#39; eg.ID&#39;中未使用的级别。列。
table(droplevels(eg.df[eg.df$eg.filter>0,]))
# eg.filter
#eg.ID 1
# B 2
# D 2
# F 1
# H 1
# J 1
# L 1
# N 1
# P 1
# R 1
# T 1
# V 1
# X 1
# Z 1
答案 1 :(得分:0)
只需将其配置,然后运行table()
# Sample code -- note stringAsFactors = FALSE
df <- data.frame(id = rep(LETTERS[1:26], length.out=30), filter = rep(0:1, length.out=30), stringsAsFactors = FALSE)
table(df[df$filter > 0, ])
输出:
> table(df[df$filter > 0, ])
filter
id 1
B 2
D 2
F 1
H 1
J 1
L 1
N 1
P 1
R 1
T 1
V 1
X 1
Z 1