如何解决基于行的减法
df <- data.frame(PatientID = c("0002","0002","0005","0009","0018","0020","0027","0039","0042","0043","0045","0046","0048","0055"),Timepoint= c("A","B","A","A"),A = c(NA,977.146,NA,964.315,952.311,950.797,958.975,960.712,947.465,902.852,985.124,930.141,1007.790,948.848,1027.110,999.414),B = c(998.988,998.680,1020.560,947.751,1029.560,955.540,911.606,964.039,988.087,902.367,959.338,1029.050,925.162,987.374,1066.400,957.512,917.597),C = c( NA,987.140,961.810,929.466,978.166,1005.820,925.752,969.469,943.398,936.034,965.292,996.404,920.610,967.047,986.565,913.517,893.428,921.606,929.590,950.493),D = c(975.634,976.192,E = c(1006.330,1028.070,954.274,1005.910,949.969,992.820,977.048,934.407,948.913,961.375,955.296,961.128,998.119,1009.110,994.891,1000.170,982.763),G= c(NA,958.990,924.680,955.927,949.384,973.348,984.392,943.894,961.468,995.368,994.997,979.454,952.605,956.507),stringsAsFactors = F)
我需要的是创建一个新的 df$Timepoint
因子,即 C,它将通过减去 [df$timepoint==B - df$timepoint==A]
为了清楚起见,我在下面粘贴了一个小示例,其中包含来自上述数据集的 3 位患者。
感谢您的帮助!
解决方法
<table class="table table-light">
{{ subbudget.management_form }}
{% for form in subbudget.forms %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th scope="col">{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tbody>
<tr class="{% cycle row1 row2 %} budget_formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
</tbody>
{% endfor %}
</table>
<script src="{% static 'home/formset/jquery.formset.js' %}"></script>
<script type="text/javascript">
$('.budget_formset_row').formset({
addText: 'Add row',deleteText: 'remove',prefix: 'budget_set'
});
</script>
,
这应该可以解决问题:
library(dplyr)
rbind(df,df %>%
group_by(PatientID) %>%
mutate(across(c("A":"G"),~ . - lag(.))) %>%
filter(Timepoint == "B") %>%
mutate(Timepoint = "C")) %>%
arrange(PatientID,Timepoint)
输出:
PatientID Timepoint A B C D E G
1 0002 A NA 998.988 NA 975.634 1006.330 NA
2 0002 B 977.146 NA 987.140 987.140 1028.070 958.990
3 0002 C NA NA NA 11.506 21.740 NA
4 0005 A NA 998.680 961.810 961.810 NA NA
5 0005 B 964.315 NA 929.466 929.466 954.274 NA
6 0005 C NA NA -32.344 -32.344 NA NA
7 0009 A NA NA 978.166 978.166 1005.910 924.680
8 0009 B 952.311 1020.560 1005.820 1005.820 949.969 955.927
9 0009 C NA NA 27.654 27.654 -55.941 31.247
10 0018 A NA 947.751 925.752 925.752 992.820 NA
11 0018 B 950.797 1029.560 969.469 969.469 977.048 949.384
12 0018 C NA 81.809 43.717 43.717 -15.772 NA
,
您可以汇总数据帧并将其绑定到原始数据帧。
library(dplyr)
df %>%
arrange(PatientID,Timepoint) %>%
group_by(PatientID) %>%
summarise(across(A:G,.fns = diff)) %>%
ungroup %>%
mutate(Timepoint = 'C',.before = 2) %>%
bind_rows(df) %>%
arrange(PatientID,Timepoint)
# PatientID Timepoint A B C D E G
# <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 0002 A NA 999. NA 976. 1006. NA
# 2 0002 B 977. NA 987. 987. 1028. 959.
# 3 0002 C NA NA NA 11.5 21.7 NA
# 4 0005 A NA 999. 962. 962. NA NA
# 5 0005 B 964. NA 929. 929. 954. NA
# 6 0005 C NA NA -32.3 -32.3 NA NA
# 7 0009 A NA NA 978. 978. 1006. 925.
# 8 0009 B 952. 1021. 1006. 1006. 950. 956.
# 9 0009 C NA NA 27.7 27.7 -55.9 31.2
#10 0018 A NA 948. 926. 926. 993. NA
# … with 19 more rows
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。