2015-05-06 50 views
0

我想将我的数据设置为在R中进行分析。我首先要按组,A或B拆分它们,然后拆分这些组随着年龄增长。拆分数据设置为组,然后按年龄拆分这些组R

Data <- read.csv("https://stackoverflow.com/users/SLA9DI/Documents/Test.csv") 
split(Data,Data$Group) 

但后来当我尝试split(Data,Data$Age)它仅年龄拆分它,当我尝试split(Data$Group,Data$Age)同样的事情发生了:我已经使用分割()函数如下尝试。这些数据将用于比较同一年龄段的人群。我也可能会在后期抛出性别,所以如果我能够在这些年龄内进一步按性别进行分配,那将会更有帮助。例如:

Group Age Data Data2 
A   13 15 10 
A   13 14 6 
A   18 13 2 
A   8 13 8 
A   12 2 2 
A   14 2 2 
A   16 3 2 
A   16 4 4 
A   16 23 5 
A   16 15 4 
B   13 5 5 
B   13 56 6 
B   18 6 1 
B   8 76 6 
B   12 7 3 
B   14 8 2 
B   16 9 2 
B   16 10 5 
B   16 11 6 
B   16 12 7 

编辑:把它们分成组,然后将这些团体多达内分裂的时代,这样我就可以与16岁组A.比较16年B岁组。此外,我可能要甚至进一步分裂成性别后,说比一个16岁的女 B或组A组,与16岁的在A组或B

+0

这将是比较容易回答如果提供一个[再现的示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)含样本数据以及您希望获得的样本数据的确切结果。 – akhmed

+0

也许'分裂(数据,交互(数据$组,数据$年龄))''如果你真的想,但有很多功能和软件包可用,做split/apply/combine更好 – rawr

回答

0

首先,而不是分割数据您是否考虑过多次保存数据,并使用by()aggregate()以及某些功能进行分析?

其次,您只需将第二个分割应用于所有输出数据。最简单的方法是编写一个快速函数来包装并略微修改内置的split,以便您可以简单地传递要分割的变量的变量名称,而不是向量。

以下工作:

options(stringsAsFactors = FALSE) 
testdata <- data.frame(Age=c(10,11,9,10,13,12,11,9,10,8,13), 
         Group=c("A","B","A","C","D","A","A","A","C","B","C"), 
         Var1=c(3,4,1,3,3,1,7,3,1,7,4)) 

func.split_wrapper <- function(dataframe,varname) {return(split(x = dataframe,f = dataframe[[varname]]))} 

testdata.split1 <- func.split_wrapper(dataframe = testdata,varname = "Age") 
testdata.split2 <- lapply(X = testdata.split1,FUN = func.split_wrapper,varname = "Group") 

print(testdata.split2) 

$`8` 
$`8`$B 
    Age Group Var1 
10 8  B 7 


$`9` 
$`9`$A 
    Age Group Var1 
3 9  A 1 
8 9  A 3 


$`10` 
$`10`$A 
    Age Group Var1 
1 10  A 3 

$`10`$C 
    Age Group Var1 
4 10  C 3 
9 10  C 1 


$`11` 
$`11`$A 
    Age Group Var1 
7 11  A 7 

$`11`$B 
    Age Group Var1 
2 11  B 4 


$`12` 
$`12`$A 
    Age Group Var1 
6 12  A 1 


$`13` 
$`13`$C 
    Age Group Var1 
11 13  C 4 

$`13`$D 
    Age Group Var1 
5 13  D 3 
+0

我也意识到我可以只是使用函数'subset(data,Age = 18&Group =“Normal”)'并将其作为对象存储,而不是'split()' –

+0

然而,在非函数中使用subset命令通常是一种糟糕的做法交互环境。更好的方法是使用by()或aggregate()。 – TARehman

+0

啊,我明白了。我进一步阅读它,人们一直在推荐[函数,而不是subset() –

0

我可以做如下。首先通过expand.grid()获得独特的群组和性别对。然后循环遍历列。

set.seed(1237) 
df <- data.frame(group = sample(c("A","B"), 10, replace = T), 
       gender = sample(c("M","F"), 10, replace = T), 
       age = sample(c(20:25), 10, replace = T)) 

grid <- unique(expand.grid(df$group, df$gender)) 
names(grid) <- c("group", "gender") 
grid 

#group gender 
#1  A  M 
#2  B  M 
#11  A  F 
#12  B  F 

lapply(1:nrow(grid), function(x) { 
    df[df$group == grid[x, 1] & df$gender == grid[x, 2],] 
}) 

[[1]] 
group gender age 
1  A  M 22 
3  A  M 25 
4  A  M 20 
8  A  M 22 

[[2]] 
group gender age 
6  B  M 24 
9  B  M 25 
10  B  M 22 

[[3]] 
group gender age 
5  A  F 20 

[[4]] 
group gender age 
2  B  F 24 
7  B  F 25