如何根据R中一列的值对该表进行子集/拆分?

时间:2014-10-07 11:42:54

标签: r statistics

可以在此处找到数据:https://www.dropbox.com/s/l7pc11hhiwr8zzn/data.csv?dl=0,或者在MASS库中找到nlschools

我想根据nlschools $ SES的价值拆分此表,将表格划分为nlschools$SES<=3030 < SES <= 40> 40的表格,并保留所有列。

我尝试过像0:30这样的间隔使用剪切,但结果非常混乱,并且没有剩余完整的列集。

我希望我想要实现的目标足够清晰。

3 个答案:

答案 0 :(得分:2)

试试这个:

indx <- with(nlschools,cut(SES, c(-Inf, 30, 40, Inf)))
lst <- split(nlschools, indx)

lapply(lst, head,2)
#$`(-Inf,30]`
#  lang   IQ class GS SES COMB
#1   46 15.0   180 29  23    0
#2   45 14.5   180 29  10    0

#$`(30,40]`
#  lang   IQ class GS SES COMB
#37   39 11.0  1082 25  33    1
#39   43 10.5  1280 31  33    1

#$`(40, Inf]`
#  lang IQ class GS SES COMB
#49   31  9  1280 31  50    1
#71   45 15  1880 28  50    0

如果您需要它作为单独的数据集:

list2env(setNames(lst, c("sesLOW", "sesMED", "sesHIGH")), envir=.GlobalEnv)
# <environment: R_GlobalEnv>


head(sesLOW,3)
#  lang   IQ class GS SES COMB.
#1   46 15.0   180 29  23    0
#2   45 14.5   180 29  10    0
#3   33  9.5   180 29  15    0

使用@Ujjwal的帖子检查结果

identical(sesLOW, one)
#[1] TRUE

identical(sesMED, two)
#[1] TRUE

identical(sesHIGH, three)
#[1] TRUE

但是,在列表中进行所有分析/计算比在单独的数据集中更容易。即使您可以使用lapplywrite.table/write.csv等单独保存列表元素

更新

如果您想在list

中创建新列
names(lst) <- c("low","med", "high")#no need to rename the list elements though. You can directly use it as a vector in the `Map`
lst2 <- Map(function(x, y) {x[,"SEScat"] <- y;x }, lst, names(lst))
lapply(lst2, head,2)
#$low
#  lang   IQ class GS SES COMB SEScat
#1   46 15.0   180 29  23    0    low
#2   45 14.5   180 29  10    0    low

#$med
#  lang   IQ class GS SES COMB SEScat
#37   39 11.0  1082 25  33    1    med
#39   43 10.5  1280 31  33    1    med

#$high
#  lang IQ class GS SES COMB SEScat
#49   31  9  1280 31  50    1   high
#71   45 15  1880 28  50    0   high

答案 1 :(得分:1)

尝试:

one<-subset(nlschools, nlschools$SES <=30)
two<-subset(nlschools, nlschools$SES >30 &  nlschools$SES<=40)
three<-subset(nlschools, nlschools$SES >40)

答案 2 :(得分:1)

在回复您对@akrun的评论时,请尝试:

> ddf$SEScat = with(ddf, ifelse(SES<=30,'low', ifelse(SES<=40, 'med', 'high')))
> ll = split(ddf, ddf$SEScat)

> head(ll[[1]])
      X lang   IQ class GS SES COMB SEScat
49   49   31  9.0  1280 31  50    1   high
71   71   45 15.0  1880 28  50    0   high
82   82   47 12.0  1880 28  50    0   high
85   85   33 13.0  1880 28  50    0   high
90   90   31 10.5  1880 28  50    0   high
145 145   50 13.5  2680 21  45    0   high
> head(ll[[2]])
  X lang   IQ class GS SES COMB SEScat
1 1   46 15.0   180 29  23    0    low
2 2   45 14.5   180 29  10    0    low
3 3   33  9.5   180 29  15    0    low
4 4   46 11.0   180 29  23    0    low
5 5   20  8.0   180 29  10    0    low
6 6   30  9.5   180 29  10    0    low
> head(ll[[3]])
    X lang   IQ class GS SES COMB SEScat
37 37   39 11.0  1082 25  33    1    med
39 39   43 10.5  1280 31  33    1    med
40 40   25  8.5  1280 31  33    1    med
42 42   41 11.0  1280 31  37    1    med
45 45   21  9.5  1280 31  40    1    med
52 52   29  8.5  1280 31  40    1    med