Net.Mail.SmtpClient.Send()
我的问题是如何实现一个函数来计算数据表中个人在几天内的增长率。这是形态数据,因此生长速度将计算为log(body day(i-1))-log(body day(i-1))。换句话说,(今天的身高)-(昨天的身高)。每个小组有5个人,为期10天。查找每个人每天的增长率是该帖子的目标,并重新创建发布的图表,但表示每天的增长率。随附一些模拟数据。
任何建议将不胜感激。
答案 0 :(得分:1)
好吧,我data.table
不好,但这是tidyverse
的尝试。
首先,我将重新制作您的数据。
library(tidyverse)
set.seed(100)
# Making data
date <- rep(1:10, each=10)
id <- rep(1:10, 10)
grp <- rep(1:2, each=5)
df <- cbind(date, grp, id) %>%
as_tibble %>%
rowwise %>%
mutate(bodysize = rnorm(1, mean = 5 + grp)) %>%
ungroup
我想出一个比pivot_wider
更好的解决方案,要逐个进行滞后,然后转回长格式,以便使滞后正常工作。
result <- df %>%
pivot_wider(names_from = c(grp, id),
values_from = bodysize) %>%
mutate_at(vars(-date),
list(growth = ~. - lag(.))) %>%
pivot_longer(-date, names_to = c("grp", "id"),
names_pattern = "([0-9]+)_([0-9]+)",
values_to = "growth") %>%
filter(!is.na(growth))
现在,我不确定您想要的情节是什么。您提到了5个人,但您有10个ID。如果我们分别绘制它们,则绘制会有些混乱,但是您可以使用aes
来分隔每行。
# Plot
ggplot(result,
aes(x = date, y = growth, group = id)) +
geom_line(position = "identity",
aes(color = as.factor(grp)), size = 2, linetype = 2) +
geom_point(size = 2) +
theme_minimal() +
labs(x = "Date", y = "Body size (mm)", color = "Group" )
或者,如果您愿意的话,我们当然可以对每个ID进行平均,以获得更整洁的情节。
# Alternative plot
ggplot(result %>% group_by(date, grp) %>% summarise(grp_mean = mean(growth)),
aes(x = date, y = grp_mean, group = grp)) +
geom_line(position = "identity",
aes(color = as.factor(grp)), size = 2, linetype = 2) +
geom_point(size = 2) +
theme_minimal() +
labs(x = "Date", y = "Body size (mm)", color = "Group")
由reprex package(v0.2.1)于2019-12-06创建
(为更好的尝试而完全编辑。)