2015-10-14 61 views
0

中的子數據框處理問題。我有一個數據幀,假設是這樣的:如何拆分數據幀並能夠使用R

sp rd pH abund area point 
dog uniq 4.5  5 1  a 
dog uniq 4.2  5 1  a 
dog for 6.1  3 1  a 
cat uniq 7.0  8 1  a 
cat uniq 4.9  5 1  a 
cat mains 3.1  9 1  b 
cat mains 6.5  1 1  b 
cat mains 6.5  3 1  b 
dog for NA  2 2  a 
bird mac 5.0 3 2  a 
bird mac 4.1 5 2  a 
bird mac 5.1 NA 2  a 
rabb lol 5.0  8 2  b 
rabb lol 4.2  5 2  b 
rabb lol 6.0  2 2  b 
rabb lol 2.8  3 2  b 

和ID喜歡通過areapoint獨特的組合在幾個dataframes拆分此數據框(1A,1B,2A,2B),並希望仍然能夠一起工作他們分開。例如,我想找出每組中的均值。我嘗試使用split函數,但問題是,每個組只有名稱,例如1.a,我不能命令R在此數據框內執行任何操作。

Thx for answers。

+0

'library(data.table); setDT(DF)[,{DO STUFF HERE},by =。(area,point)]'這個庫的介紹材料可以在這裏找到:https://github.com/Rdatatable/data.table/wiki/Getting-開始 – Frank

+0

'變換(DF,mean_abund = ave(abund,area,point))''。或者可能是'彙總(丰度〜面積+點,DF,平均值)',這取決於你想要什麼。 –

+0

爲什麼不把'sprintf(「%i%s」,df $ area,df $ point)'成一個新的列,然後是'group_by'? –

回答

0

如果我理解你的問題正確,這裏是我下面嘗試:

sp <- 
c("dog","dog","dog","cat","cat","cat","cat","cat","dog","bird","bird", 
"bird","rabb","rabb","rabb","rabb") 

rd <- 
c("uniq","uniq","for","uniq","uniq","mains","mains","mains", 
"for","mac","mac","mac","lol","lol","lol","lol") 

pH <- 
c(4.5,4.2,6.1,7.0,4.9,3.1,6.5,6.5,NA,5.0,4.1,5.1,5.0,4.2,6.0,2.8) 

abund <- 
c(5,5,3,8,5,9,1,3,2,3,5,NA,8,5,2,3) 

area <- 
c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2) 

point <- 
c("a","a","a","a","a","b","b","b","a","a","a","a","b","b","b","b") 

df <- data.frame(sp,rd,pH,abund,area,point) 

cols <-c("area","point") 

df$group <- apply(df[,cols],1,paste,collapse="") 
df$group <- as.factor(df$group) 
str(df$group) 
sapply(split(df$abund,df$group),mean,na.rm=TRUE) 

讓我知道

1a  1b  2a  2b 
5.200000 4.333333 3.333333 4.500000 

下面是一個選擇,如果有人不希望拆分數據幀。這裏的數據框架的樣子,現在在此基礎上一步

df$group <- apply(df[,cols],1,paste,collapse="") 
df 
    sp rd pH abund area point group 
1 dog uniq 4.5  5 1  a 1a 
2 dog uniq 4.2  5 1  a 1a 
3 dog for 6.1  3 1  a 1a 
4 cat uniq 7.0  8 1  a 1a 
5 cat uniq 4.9  5 1  a 1a 
6 cat mains 3.1  9 1  b 1b 
7 cat mains 6.5  1 1  b 1b 
8 cat mains 6.5  3 1  b 1b 
9 dog for NA  2 2  a 2a 
10 bird mac 5.0  3 2  a 2a 
11 bird mac 4.1  5 2  a 2a 
12 bird mac 5.1 NA 2  a 2a 
13 rabb lol 5.0  8 2  b 2b 
14 rabb lol 4.2  5 2  b 2b 
15 rabb lol 6.0  2 2  b 2b 
16 rabb lol 2.8  3 2  b 2b 

現在如果你想按組劃分:

df1a <- df[grepl("1a",df$group),] 

df1a 

    sp rd pH abund area point group 
1 dog uniq 4.5  5 1  a 1a 
2 dog uniq 4.2  5 1  a 1a 
3 dog for 6.1  3 1  a 1a 
4 cat uniq 7.0  8 1  a 1a 
5 cat uniq 4.9  5 1  a 1a 
+0

Thx很多,但這不解決我的問題。我需要將我的數據框分割成數據框,這可能會起作用。解決平均問題教我解決這個問題,只有這個小問題。但是非常感謝你。 – Bobesh

+0

嗯,好吧,我可以修改它,我以爲你的意思是更多的拆分 - 應用 - 組合範例。讓我澄清一下,你想創建幾個基於列組合的數據框,然後計算它們的均值?如果提供的答案能夠解決您的問題而無需創建額外的對象,那麼子檢查的目的是什麼? – zazu

+0

我編輯了代碼,但是,我個人沒有看到將df分割成newdf和計算平均值的一點,當你可以用sapply() – zazu

0

嘗試使用「GROUP_BY」。我不確定你想要的確切數據,但如果你想要每個面積和點的組合的平均pH值,你可以這樣做:

你顯然必須處理你的NA值,但是這將會通過獨特的組合組合來解決問題。

df.grp <- group_by(df, area, point) %>% 
summarize(meanpH = mean(pH))