如何在R中对具有条件的组中的行求和

14ifxucb  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(84)

我可以请求你的帮助,如何在一个组内求和行,但有条件。
条件是,如果window等于10,则保留count 1值,但如果它不等于10,则对具有相同ID但保留组内第一个值(或最小值)的窗口大小的行求和。
我相信mutate不会起作用,或者也许可以用summarise来完成,但我不知道如何在条件下完成。
这是我的代码,但我卡住了,因为这将创建一个新的列。

result_df1 <- df1 %>% 
  group_by(id) %>% 
  mutate(new_count1 = ifelse(window==10, count1, sum(count1)))

字符串
示例数据:
在下表中,id 4的count 1和count 2的值在result_df1中求和,因为它的两个窗口都不等于10。
DF1
| 窗口|计数1|计数2| count2 |
| --|--|--| ------------ |
| 10个|二个|三十| 30 |
| 二百三十|五十三|三个| 3 |
| 四百三十|四十|五| 5 |
| 10个|三个|九十四| 94 |
| 三百七十|三十二|四| 4 |
| 三百八十|十四岁|三个| 3 |
result_df1(这是我想要的结果)
| 窗口|计数1|计数2| count2 |
| --|--|--| ------------ |
| 10个|二个|三十| 30 |
| 二百三十|五十三|三个| 3 |
| 四百三十|四十|五| 5 |
| 10个|三个|九十四| 94 |
| 三百七十|四十六|七| 7 |
谢谢你的帮助!

laik7k3q

laik7k3q1#

使用by

by(d, d$id, \(x) {
  if (all(x$window != 10)) {
   data.frame(c(x[1, 1:2], colSums(x[, 3:4])))
  } else {
    x
  }
}) |> do.call(what='rbind')
#     id window count1 count2
# 1.1  1     10      2     30
# 1.2  1    230     53      3
# 2    2    430     40      5
# 3    3     10      3     94
# 4    4    370     46      7

字符串

  • 数据:*
d <- structure(list(id = c(1L, 1L, 2L, 3L, 4L, 4L), window = c(10L, 
230L, 430L, 10L, 370L, 380L), count1 = c(2L, 53L, 40L, 3L, 32L, 
14L), count2 = c(30L, 3L, 5L, 94L, 4L, 3L)), class = "data.frame", row.names = c(NA, 
-6L))

mbskvtky

mbskvtky2#

你可以group_by是否window == 10,然后sum

library(dplyr)
df %>% 
  group_by(id, tmp = window == 10) %>% 
  summarise(window = min(window),
            across(contains("count"), sum)) %>% 
  ungroup() %>% 
  select(-tmp)

字符串
或者:

df %>% 
  mutate(tmp = window == 10) %>% 
  summarise(window = min(window),
            across(contains("count"), sum), .by = c(id, tmp)) %>% 
  select(-tmp)


输出量

#   id window count1 count2
# 1  1     10      2     30
# 2  1    230     53      3
# 3  2    430     40      5
# 4  3     10      3     94
# 5  4    370     46      7

相关问题