簡體   English   中英

分組和求和數據 R

[英]Grouping and summing data R

我正在為我正在努力解決的統計計算 class 開發一個項目。 我有一個數據集,其中包括患者 ID、訪問(每個患者的基線、wk1、wk2)和代表不同葯物的 10 個變量(下面的快照中顯示的 UDS 變量)。 每個“1”代表一個陽性葯物篩選。 我必須清理數據集以僅包含患者 ID 和陽性葯物篩查的數量。 數據集快照 我必須對每位患者的所有患者就診進行分組,以便所有數據都在一行中,然后我必須對每位患者的每個葯物篩選列的所有值求和,以獲得將作為新列添加的最終值。

我應該提一下,我對 R 比較陌生,所以我正在努力精通這門語言。

我希望這是有道理的,對於任何混淆,我深表歉意。 謝謝你的幫助。 我還附上了干凈數據集應該是什么樣子的快照。 清潔數據

我努力了:

summary_urine_df <- Clean_urine_df %>%
group_by(PATDEID, VISIT) %>%
summarize(UDS005 = sum(UDS005), UDS006 = sum(UDS006), UDS007 = sum(UDS007), 
            UDS008 = sum(UDS008), UDS009 = sum(UDS009), UDS010 = sum(UDS010),
            UDS011 = sum(UDS011), UDS012 = sum(UDS012), UDS013 = sum(UDS013),
            UDS014 = sum(UDS014))
Cleaner_urine_df <- summary_urine_df %>% mutate(
  nPosScreen = UDS005 + UDS006 + UDS007 + UDS008
  + UDS009 + UDS010 + UDS011 + UDS012 + UDS013 + UDS014) %>%
  mutate(nPosScreens = as.numeric(nPosScreen)) %>%
  select(PATDEID, nPosScreens)

如果沒有可重復的數據,您似乎想使用pivot_longer()堆疊單個葯物篩選。 然后group_by()患者 id 並summarise以生成患者內的總和。

library(tidyverse)

df %>%
  pivot_longer(
    cols = starts_with('UDS'),
    names_to = 'drug',
    values_to = 'positive'
  ) %>%
  group_by(PATDEID) %>%
  summarise(
    nPosScreen = sum(positive, na.rm = T)
  ) %>%
  select(PATDEID, nPosScreen)

如果我讓你正確,你只需要總結每個病人,所有非零條目。 所以這是一個拆分數據框(沒有 ID 和周列)並進行總和的問題。

首先我模擬一些看起來像你的數據:

#simulate data
set.seed(100)
PATIENTS = paste("ID",1:10,sep="")
VISITS = paste("wk",1:12,sep="")
COLS = paste("UDS",sprintf("%03d",5:14),sep="")
N=length(PATIENTS)*length(VISITS)*length(COLS)
Clean_urine_df = data.frame(
ID = rep(PATIENTS,each=length(VISITS)),
matrix(as.numeric(runif(N)>0.5),ncol=length(COLS)),
VISITS = rep(VISITS,each=length(PATIENTS))
)

colnames(Clean_urine_df)[2:11] = COLS
head(Clean_urine_df)

> head(Clean_urine_df)
   ID UDS005 UDS006 UDS007 UDS008 UDS009 UDS010 UDS011 UDS012 UDS013 UDS014
1 ID1      0      0      0      0      0      0      0      1      1      1
2 ID1      0      0      1      0      0      1      0      1      0      1
3 ID1      1      0      1      1      1      0      1      1      1      0
4 ID1      0      1      1      0      0      0      0      0      1      0
5 ID1      0      0      0      1      0      0      1      0      1      1
6 ID1      0      0      1      1      0      1      0      1      1      0
  VISITS
1    wk1
2    wk1
3    wk1
4    wk1
5    wk1
6    wk1

雖然我已經定義了我想總結的列,但想象一下在你的場景中,你可以再次定義它:

COLS <- c("UDS005","UDS006","UDS007","UDS008","UDS009","UDS010","UDS011","UDS012","UDS013", "UDS014")

現在如前所述,您可以使用基礎 R function 進行總結:

counts = by(Clean_urine_df[,COLS],Clean_urine_df$ID,sum,simplify=TRUE)
data.frame(id=levels(Clean_urine_df$ID),nPosScreens=as.numeric(counts))
     id nPosScreens
1   ID1          61
2  ID10          57
3   ID2          56
4   ID3          65
5   ID4          60
6   ID5          61
7   ID6          61
8   ID7          64
9   ID8          67
10  ID9          65

“by” function 采用矩陣或 data.frame,根據 Clean_urine_df$ID 將其分割並總結所有內容。

同樣你可以在 dplyr 中做一些事情,但是你需要 purrr:

library(dplyr)
library(purrr)

t(map_df(split(Clean_urine_df[,COLS],Clean_urine_df$ID),sum))

暫無
暫無

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

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