拆分行但保留标签

时间:2016-01-06 20:18:16

标签: r dplyr

我想在数据框中拆分一些值,但是想要保留一些标签,同时为新的拆分允许一个新标签。例如:

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除以3。但如果可以回答这里的基本问题,我可以想出来。

2 个答案:

答案 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

答案 1 :(得分: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