2015-05-06 100 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