我有一个与此类似的数据集:
x <- sample(c("A", "B", "C", "D"), 1000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
y <- sample(1:40, 1000, replace=TRUE)
d <- data.frame(x,y)
str(d)
'data.frame': 1000 obs. of 2 variables:
$ x: Factor w/4 levels "A","B","C","D": 1 3 3 2 3 3 3 3 4 3 ...
$ y: int 28 35 14 4 34 36 30 35 26 9 ...
table(d$x)
A B C D
115 204 637 44
因此,在我的真实数据集中,我有多个这些类别(A,B,C,D)。
我的真实数据集的str()
str(realdata)
data.frame': 346340 obs. of 91 variables:
$ author : Factor w/ 42590 levels "-jon-","--LZR--",..: 1962 3434 1241 7666 6235 2391 1196 2779 1881 339 ...
$ created_utc : Factor w/ 343708 levels "2015-05-01 02:00:41",..: 14815 23163 2281 3569 5922 7211 15783 5512 13485 8591 ...
$ group : Factor w/ 5 levels "xyz","abc","bnm",..: 2 2 2 2 2 2 2 2 2 2 ...
....
现在我想要对数据进行子集化,因此我的新数据帧中只有那些$ authors(或$x
数据框中的d
)的行总共超过100个条目。
我尝试了以下内容:
dnew <- subset(realdata, table(realdata$author) > 100)
它给了我一个结果,但似乎并非包括作者的所有条目。虽然它应该更多,但我只获得完整数据集的1.3%的行。我手动检查了它(使用excel),它应该超过这个(大约30%)。手动分析显示,1.2%的$ author代表30%的参赛作品。因此,他似乎只给了我一行,其中包含超过100个参赛作品的$作者,但不是所有参赛作品。
你知道解决这个问题的方法吗?
答案 0 :(得分:3)
我们可以使用data.table
轻松完成此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(d)
,按&#39; x&#39;分组,if
观察数量大于100,我们将数据设为子集(.SD
)
library(data.table)
ddt <- setDT(d)[, if(.N > 100) .SD, x]
或者如果我们使用dplyr
,可以使用相同的方法。
library(dplyr)
dpl <- d %>%
group_by(x) %>%
filter(n() > 100) %>%
droplevels()
str(dpl)
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 866 obs. of 2 variables:
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ...
# $ y: int 25 25 13 11 2 32 12 15 12 3 ...
此外,在使用base R
时,table
可能会有所帮助
v1 <- table(d$x)
d1 <- subset(d, x %in% names(v1)[v1 > 100])
作为专栏&#39; x&#39;是factor
,当我们subset
数据集时,级别仍然存在,以删除该使用droplevels
d2 <- droplevels(d1)
由于OP没有设置seed
,每个人的输出会有所不同。
str(d2)
#'data.frame': 866 obs. of 2 variables:
#$ x: Factor w/ 2 levels "B","C": 1 1 2 1 1 2 2 2 2 2 ...
#$ y: int 25 25 13 11 2 32 12 15 12 3 ...
答案 1 :(得分:1)
予。数据框d
有四个级别
table(d$x)
# A B C D
# 92 232 630 46
II。检查哪个级别有超过100条记录
which(table(d$x)>100)
# B C
# 2 3
III。子集d
数据框仅包含属于具有大于100个记录的级别的记录,即。 level B
和level C
result <- d[ d$x %in% names(table(d$x))[table(d$x) > 100] , ]
dim(result)
# [1] 862 2
str(result)
# 'data.frame': 862 obs. of 2 variables:
# $ x: Factor w/ 4 levels "A","B","C","D": 3 2 3 3 2 2 2 3 3 3 ...
# $ y: int 29 32 27 40 30 38 8 16 2 23 ...
等级A
和D
仍然存在0 records
table(result$x)
# A B C D
# 0 232 630 0
IV。使用factor()
result$x <- factor(result$x)
str(result)
# 'data.frame': 860 obs. of 2 variables:
# $ x: Factor w/ 2 levels "B","C": 2 2 1 2 1 2 2 2 1 2 ...
# $ y: int 29 32 27 40 30 38 8 16 2 23 ...
table(result$x)
# B C
# 232 630