r - 使用 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
.
解决方案
欢迎来到社区!首先,您可以按照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)
)
另一方面,您也可以确定功能min
,max
并通过添加参数sum
忽略;因此:NA
na.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)
)
推荐阅读
- php - 根据可用的总图像数计算图像将使用的列数
- ios - 从字典中获取日期值
- javascript - 卡住!需要用一个方法创建一个类然后创建4个属性
- python - 如何使用 msgraph-sdk-python 将文件上传到 onedrive?
- testing - 如何与 NightwsatchJS 并行运行单独的测试
- python - Python MYSQL游标更新查询不起作用
- java - 从 bean 获取唯一的实体 id
- php - WooCommerce 订单列表:根据过滤结果计算总计
- asp.net-mvc - 通过操作过滤器属性更新他的信息后,如何重定向到同一页面(用户试图访问)?
- asp.net-mvc - 即使操作中没有错误,asp.net core 也会抛出 500