首页 > 解决方案 > 使用 R Shiny 对多列求和的问题

问题描述

好的,我对此很陌生,但这里有。问题是在某些情况下,总和值不会出现在我的数据表中。我有一个包含几列的数据集,其中一列名为 Class。在 Class 列中,我有几个类。- 高级,初级等。数据与竞争对手一起排列,这些竞争对手可以在行中的不同类别下多次出现。这是有效的。下面是一个非常小的部分

table_dataCrewstwo <- tribble(
  ~Name1, ~Year, ~Class, ~Name, ~Time, ~Club, ~Position, ~Trophies, ~BoatType, ~DecimalTime, ~Ladies, ~Military, ~SeniorC, ~JuniorC, ~SinglesC, ~VetJuniorC, ~EndeavourC, ~KayakC, ~CanadianC, ~Folding.BoatC,
  "Fie Paul", 1984, "Senior", "Fie Paul & Te C J", "20:17:00", "Terranova Scouts & Wokingham Scouts", 8, "Scouts", "Kayak", 20.2833333333333, "Male", "Civilian", "1", "", "", "", "", "1", "", "",
  "Fie Paul", 1985, "Senior", "Fie Paul & Te C J", "19:42:48", "Wokingham Scouts", 11, "Scouts", "Kayak", 19.7133333333333, "Male", "Civilian", "1", "", "", "", "", "1", "", "",
  "Fie Paul", 1987, "Singles", "Fie Paul", "18:37:24", "Wokingham Scouts", 10, "", "Kayak", 18.6233333333333, "Male", "Civilian", "", "", "1", "", "", "1", "", "",
  "Fie Paul", 1988, "Senior", "Fie Paul & Te C J", "18:51:35", "Wokingham Scouts", 6, "Scouts", "Kayak", 18.8597222222222, "Male", "Civilian", "1", "", "", "", "", "1", "", "",
  "Fie Paul", 1990, "Senior", "Dav S M & Fie Paul", "19:27:37", "Worcester", 6, "", "Kayak", 19.4602777777778, "Male", "Civilian", "1", "", "", "", "", "1", "", ""
)

Fie Paul 在几个班级(显示的是高级和单打),这在上面似乎是正确的。但是,当我做 asummerise我得到

Name1   First_Raced Last_Raced  SeniorT JuniorT SinglesT    VetJuniorT  EndeavourT  KayakT  CanadianT   Folding.BoatT

Fie Paul    1984    2017                        13  

这正确显示了 Name 1 First_Raced Last_Raced 和 KayakT,但未正确显示 SeniorT SinglesT 和 VetJuniorT(VetJuniorT 未显示在上面的显示中)。

但是,仅在 1 级中的竞争对手确实出现正确。即,似乎在超过 1 个班级会导致sum()消失。 case_when?? mutate?? group_by?? summerise?

这是代码。

data <- table_dataCrewstwo %>%
  mutate(
    SeniorC = case_when(Class == "Senior"  ~ 1),
    JuniorC = case_when(Class == "Junior"  ~ 1),
    SinglesC = case_when(Class == "Singles"  ~ 1),
    VetJuniorC = case_when(Class == "Vet/Junior"  ~ 1),
    EndeavourC = case_when(Class == "Endeavour"  ~ 1),
    KayakC = case_when(BoatType == "Kayak"  ~ 1),
    CanadianC = case_when(BoatType == "Canadian"  ~ 1),
    Folding.BoatC = case_when(BoatType == "Folding Boat"  ~ 1)
  ) %>%
  group_by(Name1) %>%
  summarise(
    First_Raced = min(Year),
    Last_Raced = max(Year),
    SeniorT = sum(SeniorC),
    JuniorT = sum(JuniorC),
    SinglesT = sum(SinglesC),
    VetJuniorT = sum(VetJuniorC),
    EndeavourT = sum(EndeavourC),
    KayakT = sum(KayakC),
    CanadianT = sum(CanadianC),
    Folding.BoatT = sum(Folding.BoatC)
  )

output <- DT::renderDataTable({
  DT::datatable(
    data,
    options = list(
      search = list(
        regex = TRUE,
        caseInsensitive = FALSE,
        smart = FALSE
      ),
      pageLength = 10
    ),
    filter = list(
      position = "top",
      clear = FALSE
    ),
    rownames = FALSE
  )
})

group_by如果我在和(以上)之间注释掉summerise,它会正确显示,但如果summerise继续运行,那么如果竞争对手超过 1 个班级,则数据丢失。上面的显示是通过注释掉summerise.

标签: rshinytidyversedt

解决方案


欢迎来到社区!首先,您可以按照https://stackoverflow.com/editing-help中的说明格式化您的代码。最重要的是,使用该函数提供输入数据总是非常有帮助的dput(),并且很好地格式化(和缩进)你的代码;-)我还不能这样做,所以我有

话虽如此,您的问题在于使用case_when(Class == "Senior" ~ 1). 当没有命中时,您不提供替代方案;因此函数返回NA。这不能加起来。而是使用case_when(Class == "Senior" ~ 1, TRUE ~ 0)or,更好,ifelse(Class == "Senior", 1, 0)例如;

data <- table_dataCrewstwo %>%
  mutate(
    SeniorC = ifelse(Class == "Senior", 1, 0), # this
    JuniorC = ifelse(Class == "Junior", 1, 0),
    SinglesC = ifelse(Class == "Singles", 1, 0),
    VetJuniorC = ifelse(Class == "Vet/Junior", 1, 0),
    EndeavourC = ifelse(Class == "Endeavour", 1, 0),
    KayakC = ifelse(BoatType == "Kayak", 1, 0),
    CanadianC = ifelse(BoatType == "Canadian", 1, 0),
    Folding.BoatC = ifelse(BoatType == "Folding Boat", 1, 0)
  ) %>%
  group_by(Name1) %>%
  summarise(
    First_Raced = min(Year),
    Last_Raced = max(Year),
    SeniorT = sum(SeniorC),
    JuniorT = sum(JuniorC),
    SinglesT = sum(SinglesC),
    VetJuniorT = sum(VetJuniorC),
    EndeavourT = sum(EndeavourC),
    KayakT = sum(KayakC),
    CanadianT = sum(CanadianC),
    Folding.BoatT = sum(Folding.BoatC)
  )

另一方面,您也可以确定功能minmax并通过添加参数sum忽略;因此:NAna.rm=TRUE


data <- table_dataCrewstwo %>%
  mutate(
    SeniorC = case_when(Class == "Senior"  ~ 1),
    JuniorC = case_when(Class == "Junior"  ~ 1),
    SinglesC = case_when(Class == "Singles"  ~ 1),
    VetJuniorC = case_when(Class == "Vet/Junior"  ~ 1),
    EndeavourC = case_when(Class == "Endeavour"  ~ 1),
    KayakC = case_when(BoatType == "Kayak"  ~ 1),
    CanadianC = case_when(BoatType == "Canadian"  ~ 1),
    Folding.BoatC = case_when(BoatType == "Folding Boat"  ~ 1)
  ) %>%
  group_by(Name1) %>%
  summarise(
    First_Raced = min(Year),
    Last_Raced = max(Year),
    SeniorT = sum(SeniorC, na.rm = TRUE), # This
    JuniorT = sum(JuniorC, na.rm = TRUE),
    SinglesT = sum(SinglesC, na.rm = TRUE),
    VetJuniorT = sum(VetJuniorC, na.rm = TRUE),
    EndeavourT = sum(EndeavourC, na.rm = TRUE),
    KayakT = sum(KayakC, na.rm = TRUE),
    CanadianT = sum(CanadianC, na.rm = TRUE),
    Folding.BoatT = sum(Folding.BoatC, na.rm = TRUE)
  )

推荐阅读