簡體   English   中英

創建 function 以使用 R 中不同列表中的列表元素生成新值

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

我有一個 19000 x 20 dataframe,我需要根據桶(總共有 5 個桶)進行拆分,然后根據每個桶的控件的平均值和標准差為所有患者生成分數。 到目前為止,我已經弄清楚了如何拆分數據並使用列表基於存儲桶生成控件的均值和標准差,但似乎無法找到生成新分數的最佳方法。

原裝 dataframe

   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 的示例所示。

從健康患者處獲取每個桶的 sd

# 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 的元素列表,其年齡和長度分別為 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

我想我將不得不創建一個 function 並且可能使用 {purr},但我不確定如何從healthypatients_meanhealthypatients_sd中獲取allpatients ,以根據每個存儲桶為所有患者生成新分數。 謝謝你的幫助!

您不一定需要在此處為每個bucket拆分數據集。 我們可以使用group_by來分別對待每個桶。

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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM