首页 > 解决方案 > R,确定跨多列的最小数字,获取相应数据以创建新变量

问题描述

我有这样的数据:

ForStack<-structure(list(study_id = c(40, 44, 49, 61, 66, 67, 68, 84, 86, 
94), Volume1 = c(67.3833333333333, 87.1165644171779, 77.6822020644354, 
79.1399603775784, 98.8751406074241, 97.0890874627674, 100.290979631426, 
70.9095801937567, 87.8125822584891, 97.4208566108007), Volume2 = c(NA, 
86.9325153374233, 71.8486080700657, NA, NA, NA, 88.8069835111542, 
55.7723358449946, NA, 77.9329608938548), Volume3 = c(NA, NA, 
NA, NA, NA, NA, 46.6052376333657, NA, NA, 64.7299813780261), 
    Volume4 = c(NA, NA, NA, NA, NA, NA, 41.8428709990301, NA, 
    NA, NA), Volume5 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
    ), TimeBetweenScans1 = structure(c(316, 113, 335, 104, 7, 
    42, 30, 643, 404, 40), class = "difftime", units = "days"), 
    TimeBetweenScans2 = structure(c(NA, 139, 660, NA, NA, NA, 
    84, 1794, NA, 221), class = "difftime", units = "days"), 
    TimeBetweenScans3 = structure(c(NA, NA, NA, NA, NA, NA, 467, 
    NA, NA, 394), class = "difftime", units = "days"), TimeBetweenScans4 = structure(c(NA, 
    NA, NA, NA, NA, NA, 826, NA, NA, NA), class = "difftime", units = "days"), 
    TimeBetweenScans5 = structure(c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), class = "difftime", units = "days")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

我已经变成了这张图: 在此处输入图像描述

如您所见,每个人的数据有多个列 (study_id),用于描述不同时间点的卷,然后它有对应于该卷时间点的列。即,如果患者 44 有一个“volume2”,那么他也有一个“TimebetweenScans2”。

如果它很重要,我会重新调整数据以通过以下方式创建该图表:

ForStack%>%pivot_longer(-study_id, 
    names_to = c(".value", "Time"), 
    names_pattern = "([A-Za-z]+)([0-9]+)")

我现在想做的是计算该图中每条线的“斜率​​”。从起点到最低音量,基本斜率很好。即:

在此处输入图像描述

换句话说,我确定如果患者有多个数据点,“真实”斜率会有某种曲线,但我不需要对此感兴趣。只是每个患者的斜率,从(100 体积,0 时间)的起点到他们的(最低体积,相应时间)。

我很挣扎,因为每位患者的最低音量可能位于不同的列中,而且并非每位患者甚至都填写了所有列。一名患者的最低音量可能在“volume2”(时间将在“TimeBetweenScans2”中),而另一位患者可能在“volume4”中具有最低音量(时间将在“TimeBetweenScans4”中)。

我很想计算该斜率并创建一个包含斜率的新列。任何帮助,将不胜感激!

标签: rtidyverse

解决方案


推荐阅读