试试这个:
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
但是,在列表中进行所有分析/计算要比作为单独的数据集更容易。即使您可以使用lapply 和write.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