R:仅当同一 ID 重复两次时才按 ID 进行汇总,但如果重复两次以上,则不进行汇总

R: summarise by ID only when the same ID repeat twice but don't summarise if it repeats more then twice

提问人:Maya Eldar 提问时间:3/27/2023 更新时间:3/27/2023 访问量:86

问:

我试图按 ID 总结数据帧,但我只想在同一个 ID 在两行中重复时进行总结,而当同一个 ID 在两行以上重复时不进行总结。 我试过:

df %>% group_by(ID) %>% dplyr::summarize_if(n() == 2, first),

但是我收到一个错误说:“错误: !必须在 dplyr 动词中使用。n()

TNX帮忙!

r dplyr 总结

评论


答:

2赞 r2evans 3/27/2023 #1
dat <- data.frame(id=c(1,1,2,2,2), val=1:5)
library(dplyr)
dat %>%
  group_by(id) %>%
  summarize(val = if (n() == 2L) first(val) else val) %>%
  ungroup()
# # A tibble: 4 × 2
#      id   val
#   <dbl> <int>
# 1     1     1
# 2     2     3
# 3     2     4
# 4     2     5

您不应该在这里使用,原因有二:summarize_if

  1. 它已被取代,更喜欢 ,使用或不使用 ;和summarize(across(...))dplyr::where
  2. 变体选择要汇总的列,而不是行。_if

要将变体用于多个列,我们可以这样做:across(..)

dat %>%
  group_by(id) %>%
  summarize(across(everything(), ~ if (n() == 2L) first(.) else .)) %>%
  ungroup()

评论

0赞 Maya Eldar 3/27/2023
谢谢!这真的很有帮助,但创建的数据框只包含一列 - ID 列,我如何汇总所有列?我也无法使您建议的跨变体,我收到一个很长的错误:错误:!计算时出现问题。i 组 730 中发生错误:ID = NA。由错误引起 : 由错误引起 : 回溯: 1. mess_data_duoble %>% group_by(ID) %>% ...11. dplyr:::d plyr_internal_error(“dplyr:::summarise_mixed_null”,dplyr::summarise()..1 = across(everything(), ~if (n() == 2L) first(.))across()dplyr_internal_error()<named list>)
1赞 r2evans 3/27/2023
如果您运行的任何内容都接近我提供的虚假数据,那么仅生成一列是不可行的(以我能想象的任何方式),至少将保留一列(如果使用,则全部保留)。由于它与我的样本数据完美配合,也许您应该提供自己的数据样本?请每组至少提供“2”和“> 2”行的示例,以便我们可以清楚地看到您期望的差异。我们不需要几十列,也许几列(分组列除外)就足够了。summarizeacross(everything(), ...)
0赞 r2evans 3/27/2023
顺便说一句,如果你只是这样做,那么你就没有尝试我的代码。如果没有子句,语句将分配给该列,这将(显然)失败。此处的使用不是可选的;我认为它可能是可选的唯一时间是,如果您正在处理列表列(我没有显示也没有建议)。across(everything(), ~if (n() == 2L) first(.))elseifNULLelse
0赞 Maya Eldar 3/28/2023
但是代码显示语法错误... :(else
0赞 r2evans 3/28/2023
我的数据没有错误。您尚未共享您的数据。请参阅 stackoverflow.com/q/5963269 最小可重现示例stackoverflow.com/tags/r/info,了解如何通过共享数据使问题可重现。最好的方法是使用 、 或 ,以便我们可以处理您正在处理的相同类型的数据。我们不需要太多,只需要足够的行和列来表达观点。dputdata.frameread.table