2016-01-06 45 views
1

我想從字面上拆分數據框中的某些值,但希望保留一些標籤,同時允許爲新拆分創建一個新標籤。例如:拆分行但保持標籤

day year depth mass 
1  2008 10  13 
2  2008 10  15 
1  2008 20  14 
2  2008 20  12 
1  2009 10  14 
2  2009 10  16 
1  2009 20  12 
2  2009 20  18 

2現在將每個質量得到:

day year depth mass 
1  2008 10a  6.5 
1  2008 10b  6.5 
2  2008 10a  7.5 
2  2008 10b  7.5 
1  2008 20a  7 
1  2008 20b  7 
2  2008 20a  6 
2  2008 20b  6 
1  2009 10a  7 
1  2009 10b  7 
2  2009 10a  8 
2  2009 10b  8 
1  2009 20a  6 
1  2009 20b  6 
2  2009 20a  9 
2  2009 20b  9 

有新的價值觀,但他們有相應的日和年的數據。

爲了讓事情更加複雜,我將在每個深度上運行一個稍微不同的函數。例如,我會將深度== 10除以2,但深度== 20除以三。但是,如果這裏的基本問題能夠得到解答,我可以弄清楚。

回答

0

一個稍微長data.table線,但我認爲這將實現你需要的東西:

library(data.table) 
df$id <- rownames(df) 
df1 <- setDT(df)[rep(1:nrow(df),times = 2),.SD,by=id][,`:=`(mass=mass/2,depth=paste(depth,c("a","b"),sep=""))] 

輸出:

df1 

id day year depth mass 
1 1 2008 10a 6.5 
1 1 2008 10b 6.5 
2 2 2008 10a 7.5 
2 2 2008 10b 7.5 
3 1 2008 20a 7.0 
3 1 2008 20b 7.0 
4 2 2008 20a 6.0 
4 2 2008 20b 6.0 
5 1 2009 10a 7.0 
5 1 2009 10b 7.0 
6 2 2009 10a 8.0 
6 2 2009 10b 8.0 
7 1 2009 20a 6.0 
7 1 2009 20b 6.0 
8 2 2009 20a 9.0 
8 2 2009 20b 9.0 
0

使用dplyr,你可以這樣說:

library(dplyr) 
df %>% group_by(day, year, depth) %>% bind_rows(., .) %>% mutate(mass = mass/2) %>% arrange(day, year, depth, mass) 

注意,我沒有做過的A/B追加的深度,但我想你也許可以做到這一點在此基礎上同樣的想法。

輸出如下:

Source: local data frame [16 x 4] 

    day year depth mass 
    (dbl) (dbl) (dbl) (dbl) 
1  1 2008 10 6.5 
2  1 2008 10 6.5 
3  1 2008 20 7.0 
4  1 2008 20 7.0 
5  1 2009 10 7.0 
6  1 2009 10 7.0 
7  1 2009 20 6.0 
8  1 2009 20 6.0 
9  2 2008 10 7.5 
10  2 2008 10 7.5 
11  2 2008 20 6.0 
12  2 2008 20 6.0 
13  2 2009 10 8.0 
14  2 2009 10 8.0 
15  2 2009 20 9.0 
16  2 2009 20 9.0 
+0

這是一個很好的答案,但另一個更完整。 – Nazer