微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于行的减法

如何解决基于行的减法

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 位患者。

enter image description here

感谢您的帮助!

解决方法

<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 举报,一经查实,本站将立刻删除。