#R
split(x, f, drop = FALSE, ...)
## Default S3 method:
split(x, f, drop = FALSE, sep = ".", lex.order = FALSE, ...)
split(x, f, drop = FALSE, ...) <- value
unsplit(value, f, drop = FALSE)
x: 一个待分组的向量或者data frame
f: 函数,一个factor或者list(如果list中元素交互作用于分组中),以此为规则将x分组
drop: 逻辑值,如果f中的某一个level没有用上则被弃用
value: 一个储存向量的list,其形式类似于分组完成之后返回的那个list
实例1:
x=1:10
f=rep(c(1,0),5)
split(x,f)
# $`0`
# [1] 2 4 6 8 10
#
# $`1`
# [1] 1 3 5 7 9
f=function(x){x%2}
split(x,f)
# $`0`
# [1] 2 4 6 8 10
#
# $`1`
# [1] 1 3 5 7 9
f=c(1,2)
split(x,f)
# $`1`
# [1] 1 3 5 7 9
#
# $`2`
# [1] 2 4 6 8 10
实例2:
d <- data.frame(gender=c("M","M","F","M","F","F"),age=c(47,59,21,32,33,24),income=c(55000,88000,32450,76500,123000,45650), over25=rep(c(1,1,0), times=2))
> d
# gender age income over25
# 1 M 47 55000 1
# 2 M 59 88000 1
# 3 F 21 32450 0
# 4 M 32 76500 1
# 5 F 33 123000 1
# 6 F 24 45650 0
res=split(d$income, list(d$gender,d$over25)) #将income按照gender、over25分组
# $`F.0`
# [1] 32450 45650
# $M.0
# numeric(0)
# $F.1
# [1] 123000
# $M.1
# [1] 55000 88000 76500
实例3:
require(stats)
require(graphics)
n <- 10
nn <- 100
g <- factor(round(n * runif(n * nn)))
x <- rnorm(n * nn) + sqrt(as.numeric(g))
xg <- split(x, g)
#分割后可以作图
boxplot(xg, col = "lavender", notch = TRUE, varwidth = TRUE)
#apply()系函数可以直接作用
sapply(xg, length)
# 0 1 2 3 4 5 6 7 8 9 10
# 50 103 95 98 112 93 93 94 104 99 59
sapply(xg, mean)
# 0 1 2 3 4 5 6 7
# 0.8923271 1.4324820 1.7787909 1.9254733 2.1598414 2.4312720 2.6217865 2.7740930
# 8 9 10
# 3.1816875 3.1226753 3.3066832
同样的python中也有split()函数,只不过python的split()函数用于对字符串的分割。如果想达到R中split()函数的分组的类似效果可以利用python中的过滤器。
x=range(1,11)
res=filter(lambda x:x%2,x)
list(res)
# [1, 3, 5, 7, 9]