我在R中有一个data.frame。我想使用循环和子集函数创建三个不同的data.frame。我有一个大的data.frame,但我需要的是在下面的例子中:
sex<-c("M","M","M","F","M","F")
age<-c(20,18,17,20,18,17)
name<-c("John", "Joseph", "Bill", "Sarah", "Robert", "Dana")
data<-data.frame(sex, age, name)
>data
sex age name
1 M 20 John
2 M 18 Joseph
3 M 17 Bill
4 F 20 Sarah
5 M 18 Robert
6 F 17 Dana
我想要的是:
>age17
sex age name
1 M 17 Bill
2 F 17 Dana
>age18
sex age name
1 M 18 Joseph
2 M 18 Robert
>age20
sex age name
1 M 20 John
2 F 20 Sarah
我可以使用以下命令:
>age17<-subset(data, data[,2]==17)
>age18<-subset(data, data[,2]==18)
>age20<-subset(data, data[,2]==20)
但是可以使用循环来减小命令的大小吗?
答案 0 :(得分:6)
使用split
:
x <- split(data, data$age)
x
$`17`
sex age name
3 M 17 Bill
6 F 17 Dana
$`18`
sex age name
2 M 18 Joseph
5 M 18 Robert
$`20`
sex age name
1 M 20 John
4 F 20 Sarah
您现在拥有一个数据框列表,您可以使用任何提取运算符访问列表的元素,即$
,[
或[[
。
例如,第一个元素:
x[1]
$`17`
sex age name
3 M 17 Bill
6 F 17 Dana
或名称为17
的元素。但请注意,您必须使用反引号来引用这些名称,因为以数字开头的名称不是标准名称:
x$`17`
sex age name
3 M 17 Bill
6 F 17 Dana