【发布时间】:2015-05-31 16:37:57
【问题描述】:
我正在尝试解决数据格式问题。 我有一个数据框,其中变量被划分为学校和学生。例如:
Schools Students
SchoolA Student1
SchoolA Student2
SchoolA Student3
SchoolB Student4
SchoolB Student5
SchoolC Student6
我想创建我的数据集的一个子集,仅保留学生人数超过 X 的学校(例如,至少 2 个)。 有没有一种简单的方法可以在 R 中做到这一点? 我如何创建一个包含每所学校学生人数的额外变量(列),以便我可以根据它进行子集化? 提前感谢您的帮助!
编辑 - - - - - -
非常感谢您的回复。我已经创建了一个示例以供将来参考。
# creating a dataset
Schools <- c('SchA','SchA','SchA','SchA','SchA',
'SchB','SchB','SchB','SchB','SchB','SchB',
'SchC','SchC')
Students <- c('st1','st2','st3','st4','st5','st6',
'st7','st8','st9', 'st10', 'st11', 'st12', 'st13')
df <- data.frame(Schools, Students)
install.packages('data.table')
library(data.table)
setDT(df)[, if(.N > 4) .SD, Schools] # only schools A & B
df[ with(df, as.numeric(ave(as.character(Students), Schools, FUN=length))) >2, ]
有没有办法创建一个额外的变量(学校规模)来保存每所学校的学生人数(该特定学校独有)? 如果我可以有这样的变量,我可以根据它进行子集化。
【问题讨论】:
-
每一行是唯一的学生,还是有时您有多行与同一个学生?如果是这样,一种方法是(假设
Students是一个因素)df[with(df, ave(as.numeric(Students), Schools, FUN = function(x) length(x) > 1)), ]。这将返回子集而不创建额外的列 -
好问题,每行只有一个学生
标签: r subset multi-level