[英]How to sum values from one column based on specific conditions from other column in R?
[英]How to sum values of one column, based on two conditions, grouped by another column value, in R?
我有一个包含许多“横断面”的数据集,多个“横断面”包含一个“平面”(例如平面 P1 = 横断面 T1 + 横断面 T2)
当前的数据结构(参见下面的示例)在“横断面长度”列中为横断面中收集的每个样本重复了每个横断面的长度。 我需要对横断面长度求和以获得每个平面的“平面长度”。
这是我得到的数据结构的样子:
平面名称 | 断面名称 | 横断面长度 | 样本 |
---|---|---|---|
P1 | T1 | 1002 | X |
P1 | T1 | 1002 | 是 |
P1 | T2 | 1034 | z |
P1 | T2 | 1034 | 一种 |
P1 | T2 | 1034 | b |
P2 | T3 | 1222 | c |
P2 | T3 | 1222 | d |
P2 | T4 | 1324 | 电子 |
我添加了一个“索引”列,认为必须有某种方法可以在该行的索引 = 1 时添加横断面长度。
data3 <- data2 %>%
group_by(transect)%>%
mutate(index = seq(n())) %>%
ungroup() %>%
显示添加的索引列的表:
平面名称 | 断面名称 | 横断面长度 | 样本 | 指数 |
---|---|---|---|---|
P1 | T1 | 1002 | X | 1个 |
P1 | T1 | 1002 | 是 | 2个 |
P1 | T2 | 1034 | z | 1个 |
P1 | T2 | 1034 | 一种 | 2个 |
P1 | T2 | 1034 | b | 3个 |
P2 | T3 | 1222 | c | 1个 |
P2 | T3 | 1222 | d | 2个 |
P2 | T4 | 1324 | 电子 | 1个 |
但现在我被困在如何为某个平面仅添加索引 = 1 的样带长度,并遍历所有平面......
因此,例如,最后,我需要它看起来像这样:
平面名称 | 断面名称 | 横断面长度 | 样本 | 指数 | 平面长度 |
---|---|---|---|---|---|
P1 | T1 | 1002 | X | 1个 | 2036 |
P1 | T1 | 1002 | 是 | 2个 | 2036 |
P1 | T2 | 1034 | z | 1个 | 2036 |
P1 | T2 | 1034 | 一种 | 2个 | 2036 |
P1 | T2 | 1034 | b | 3个 | 2036 |
P2 | T3 | 1222 | c | 1个 | 2546 |
P2 | T3 | 1222 | d | 2个 | 2546 |
P2 | T4 | 1324 | 电子 | 1个 | 2546 |
请注意,平面 P1 的平面长度仅是索引 = 1 的 T1 样线长度的总和。因此:1002 + 1034 = 2036,而不是1002 + 1002 + 1034 + 1034 + 1034 = 5106。
我使用 mutate、sum、summarize 等尝试了几种代码变体,但没有成功:
plane_lengths <- data3 %>%
mutate(plane_length = sum(transect_length[index ==1]))
^ 这个似乎什么都不做。 :(
plane_lengths <- data3 %>% group_by(plane_name) %>% summarize(plane_length = sum(transect_length))
^ 这只是添加横断面长度的每个值(所有索引值,而不仅仅是索引 = 1)
有什么方法可以修改上面的代码,只取索引 = 1 的横断面长度的值吗?
我对 R 还是有点陌生,非常感谢能得到的任何帮助。!! 谢谢你。
创建“索引”后,在创建“PlaneLength”列之前将分组更改为“Planename”
library(dplyr)
data2 %>%
group_by(Transectname) %>%
mutate(index = row_number()) %>%
group_by(Planename) %>%
mutate(PlaneLength = sum(Transectlength[index == 1])) %>%
ungroup
-输出
# A tibble: 8 × 6
Planename Transectname Transectlength Sample index PlaneLength
<chr> <chr> <int> <chr> <int> <int>
1 P1 T1 1002 x 1 2036
2 P1 T1 1002 y 2 2036
3 P1 T2 1034 z 1 2036
4 P1 T2 1034 a 2 2036
5 P1 T2 1034 b 3 2036
6 P2 T3 1222 c 1 2546
7 P2 T3 1222 d 2 2546
8 P2 T4 1324 e 1 2546
我们也可以使用with_groups
这样它就不会创建组属性
data2 %>%
with_groups(Transectname, mutate, index = row_number()) %>%
with_groups(Planename, mutate,
PlaneLength = sum(Transectlength[index == 1]))
-输出
Planename Transectname Transectlength Sample index PlaneLength
1 P1 T1 1002 x 1 2036
2 P1 T1 1002 y 2 2036
3 P1 T2 1034 z 1 2036
4 P1 T2 1034 a 2 2036
5 P1 T2 1034 b 3 2036
6 P2 T3 1222 c 1 2546
7 P2 T3 1222 d 2 2546
8 P2 T4 1324 e 1 2546
data2 <- structure(list(Planename = c("P1", "P1", "P1", "P1", "P1", "P2",
"P2", "P2"), Transectname = c("T1", "T1", "T2", "T2", "T2", "T3",
"T3", "T4"), Transectlength = c(1002L, 1002L, 1034L, 1034L, 1034L,
1222L, 1222L, 1324L), Sample = c("x", "y", "z", "a", "b", "c",
"d", "e")), class = "data.frame", row.names = c(NA, -8L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.