【发布时间】:2014-06-05 15:13:54
【问题描述】:
我想知道是否可以使用 dplyr 根据每行中的条件扩展 data.frame 的行。如果在 dplyr 中不可能,我很乐意提供任何解决方案!
这是我的数据示例
data.frame(plot=rep(c(6,7),each=4),
trans=rep(c("0,0","0,100","100,100","100,0"),2),
length_m=c(350,200,200,50,45,200,125,75) )
plot trans length_m
6 0,0 350
6 0,100 200
6 100,100 200
6 100,0 50
7 0,0 45
7 0,100 200
7 100,100 125
7 100,0 75
上面的数据代表两个图。一般来说,我的每个地块都有 1 到 4 个横断面,用 0,0 标识; 0,100; 100,100;或 100,0(上面的图都有所有四个可能的样带)。每个样带的长度由 length_m 给出。我想做的是将每个样带除以长度 L,并为每个新样带做一行。如果最后的样带
因此,如果 L = 100,上述数据集将如下所示
plot trans length_m
6 0,0_0 100
6 0,0_100 100
6 0,0_200 150
6 0,100_0 100
6 0,100_100 100
6 100,100_0 100
6 100,100_100 100
6 100,0_0 50
7 0,0_0 45
7 0_100_0 100
7 0,100_100 100
7 100,100_0 125
7 100,0_0 75
请注意,350 米长的 6, 0,0 分为 0,100 和 200 部分,长度分别为 100,100 和 150,而 50 米长的 6, 100,0 只是一个单独的部分 0,并且是仍然有 50 米长。
我已经尝试了几种不同的方法来完成这项工作,但没有什么值得发布的,所以任何帮助都将不胜感激!
【问题讨论】:
-
这并不难实现。您只需按
plot和trans进行分组。但作为 data.table 用户,我将继续回答 dplyr 粉丝,因为您似乎更喜欢这样。 -
转换后
sum(length)应该一样吗?即“0,0_300”行的长度是否应该为50,因为“0,0”之前的长度是350,但现在是450?不是所有的长度都应该小于L吗? -
嗨 MrFlick - 很棒的收获!抱歉,我搞砸了所需的输出。是的,你是正确的 sum(length) 在转换后应该是相同的。我已经修复了输出,希望这更有意义。所有长度可能不小于 L。这是因为如果样带的末端有一个小于 L 的残差,则应将其添加到前一个样带。这就是为什么 350 m 样带被分成长度为 100,100,150 的部分。希望对您有所帮助!