2015-10-16 108 views
2

我有一个大数据框,我想使用for循环将其转换为较小的子集数据框。我希望新数据框基于大/父数据框中列中的值。下面是一个例子使用for循环从一个基于关闭值创建多个数据帧

x<- 1:20 
y <- c("A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","C","C","C") 
df <- as.data.frame(cbind(x,y)) 

确定,现在我要三个数据帧,一将列x和y,但只有其中y ==“A”,第二个,其中y == “B”等等等等所以最终结果将是3个新的数据帧df.A,df.B和df.C.我意识到,这可以很容易做一个for循环,但我的实际数据有很多级别的y,所以使用for循环(或类似)将是很好的。

谢谢!

+0

你可以举一个你的数据的例子,这样我们就可以看到所有的级别了吗?通常,这种子集在大多数情况下可以在循环外部完成。 – Badger

+0

我会从正确创建数据框开始。 'df < - data.frame(x,y)'。你做这件事的方式已经成为第一列。 –

回答

5

如果要在循环中创建单独的对象,可以使用assign。我用unique,因为你说你有很多关卡。

for(i in unique(df$y)) { 
     nam <- paste("df", i, sep = ".") 
     assign(nam, df[df$y==i,]) 
     } 

> df.A 
    x y 
1 1 A 
2 2 A 
3 3 A 
4 4 A 
5 5 A 
6 6 A 
7 7 A 
8 8 A 
> df.B 
    x y 
9 9 B 
10 10 B 
11 11 B 
12 12 B 
13 13 B 
14 14 B 
+0

这会做到这一点。谢谢! – wraymond

+0

现在,如果我想将这些数据帧的每个结果转换为空间点数据帧SpatialPoints(),我可以在此循环中还是在另一个循环中执行此操作? – wraymond

2

我想你只需要split功能:

split(df, df$y) 
$A 
    x y 
1 1 A 
2 2 A 
3 3 A 
4 4 A 
5 5 A 
6 6 A 
7 7 A 
8 8 A 

$B 
    x y 
9 9 B 
10 10 B 
11 11 B 
12 12 B 
13 13 B 
14 14 B 
15 15 B 
16 16 B 
17 17 B 

$C 
    x y 
18 18 C 
19 19 C 
20 20 C 

这只是适当子集划分的输出分裂和结果的对象存储一样dfA <- split(df, df$y)[[1]]dfB <- split(df, df$y)[[2]]等问题。

+0

拆分功能可能是要走的路,但我是字符串,以避免创建所有的dofA,dfB ......因为我的真实数据有很多层次。 (1 = i in unique(df $ y)){ – wraymond