提问人:Maya Eldar 提问时间:3/27/2023 更新时间:3/27/2023 访问量:86
R:仅当同一 ID 重复两次时才按 ID 进行汇总,但如果重复两次以上,则不进行汇总
R: summarise by ID only when the same ID repeat twice but don't summarise if it repeats more then twice
问:
我试图按 ID 总结数据帧,但我只想在同一个 ID 在两行中重复时进行总结,而当同一个 ID 在两行以上重复时不进行总结。 我试过:
df %>% group_by(ID) %>% dplyr::summarize_if(n() == 2, first)
,
但是我收到一个错误说:“错误:
!必须在 dplyr 动词中使用。n()
TNX帮忙!
答:
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
- 它已被取代,更喜欢 ,使用或不使用 ;和
summarize(across(...))
dplyr::where
- 变体选择要汇总的列,而不是行。
_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”行的示例,以便我们可以清楚地看到您期望的差异。我们不需要几十列,也许几列(分组列除外)就足够了。summarize
across(everything(), ...)
0赞
r2evans
3/27/2023
顺便说一句,如果你只是这样做,那么你就没有尝试我的代码。如果没有子句,语句将分配给该列,这将(显然)失败。此处的使用不是可选的;我认为它可能是可选的唯一时间是,如果您正在处理列表列(我没有显示也没有建议)。across(everything(), ~if (n() == 2L) first(.))
else
if
NULL
else
0赞
Maya Eldar
3/28/2023
但是代码显示语法错误... :(else
0赞
r2evans
3/28/2023
我的数据没有错误。您尚未共享您的数据。请参阅 stackoverflow.com/q/5963269 最小可重现示例和 stackoverflow.com/tags/r/info,了解如何通过共享数据使问题可重现。最好的方法是使用 、 或 ,以便我们可以处理您正在处理的相同类型的数据。我们不需要太多,只需要足够的行和列来表达观点。dput
data.frame
read.table
评论