创建函数以使用 R 中不同列表中的列表元素生成新值

Create function to generate new values using list elements from different lists in R

我有一个 19000 x 20 数据框,我需要根据桶(总共有 5 个桶)进行拆分,然后根据每个桶的控件的均值和 sd 为所有患者生成分数。到目前为止,我已经想出了如何拆分数据并使用列表基于桶生成控件的均值和标准差,但似乎无法找到生成新分数的最佳方法。

原始数据帧

   row_number age length bucket
1           1  11     31      2
2           2  14     30      3
3           3  12     25      3
4           4  13     26      5
5           5  15     19      4
6           6  12     56      1
7           7  17     45      4
8           8  15     31      1
9           9  14     24      5
10         10  16     36      1

根据所有患者的存储桶将数据拆分到列表中

allpatients <- split(x = df, 
                     f = df$bucket)

# Example data for bucket 1
   row_number age length bucket
1           6  12     56      1
2           8  15     31      1
3          10  16     36      1

这会生成一个列表,其中包含存储桶 1 到 5 的列表元素,每个存储桶的数据帧如存储桶 1 示例所示。

计算健康患者每个桶的平均值

# Function for mean
func_mean <- function(data){
  bucket_mean <- data %>%
    select(age:length)
  bucket_mean <- lapply(bucket_mean, mean)
  bucket_mean <- as.data.frame(bucket_mean)
}

# Apply mean function to list
healthypatients_mean <- map(healthypatients, func_mean)

# Example data for bucket 1 
age length
14  41

这会为从 1 到 5 的每个桶生成一个元素列表,其中分别具有年龄和长度的平均值,如桶 1 的示例所示。

从健康患者中获取每个桶的标准差

# Function
func_sd <- function(data){
  bucket_sd <- data %>%
    select(age:length)
  bucket_sd <- lapply(bucket_sd, sd)
  bucket_sd <- as.data.frame(bucket_sd)
} 

# Apply sd function to list 
healthypatients_sd <- map(healthypatients, func_sd)

# Example (dummy) data for bucket 1
age length
2   4

这会为从 1 到 5 的每个桶生成一个元素列表,其年龄和长度分别为 sd,如桶 1 的示例所示。

根据健康患者的均值和标准差计算所有患者的分数

我想根据存储桶计算列表元素每一行的新分数。本质上,对于桶的年龄和长度的每个值分别为:

(allpatients - healthypatients_mean)/healthypatients_sd 每个桶

例如,存储桶 1 的最终数据应如下所示:

   row_number   age   length  bucket
1           6   -1      3.75     1
2           8    0.5   -2.5      1
3          10    1     -1.25     1

我想我将不得不创建一个函数并可能使用 {purr},但我不确定如何从 healthypatients_meanhealthypatients_sd 中获取输出来为 [=18] 生成新分数=] 基于每个桶。感谢您的帮助!

您不一定需要在此处为​​每个 bucket 拆分数据集。我们可以用group_by来分别对待每个bucket。

library(dplyr)

healthypatients %>%
  group_by(bucket) %>%
  summarise(across(c(age, length), list(mean = mean, sd = sd))) %>%
  left_join(df, by = 'bucket') %>%
  mutate(length_score = (length - length_mean)/length_sd, 
         age_score = (age - age_mean)/age_sd)