【问题标题】:Grouping and summing data R分组和求和数据 R
【发布时间】:2019-11-20 01:08:24
【问题描述】:

我正在为我的统计计算课程做一个项目,我正在努力解决这个问题。我有一个数据集,其中包括患者 ID、访问次数(每个患者的基线、wk1、wk2)和代表不同药物的 10 个变量(下面的快照中显示的 UDS 变量)。每个“1”代表一个阳性药物筛选。我必须清理数据集以仅包含患者 ID 和阳性药物筛查的数量。 Dataset snapshot。我必须对每位患者的所有患者就诊进行分组,以便所有数据都在一行中,然后我必须对每位患者的每个药物筛选列的所有值求和,以获得将作为新列添加的最终值。

我应该提一下,我对 R 比较陌生,所以我正在尽我所能精通这门语言。

我希望这是有道理的,对于任何混淆,我深表歉意。谢谢你的帮助。我还附上了干净数据集应该是什么样子的快照。 Clean data.

我试过了:

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)

【问题讨论】:

  • 请不要发布图片来分享数据,请改用dput。请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 到目前为止你有什么尝试?
  • 我尝试过将 group_by() 与 summarise() 一起使用,也尝试过 rowSum() 和 mutate()。
  • 使用适当的格式在问题中包含您尝试过的内容。切勿在评论中包含重要信息
  • 感谢您对我的帖子提供的所有有用反馈。

标签: r statistics


【解决方案1】:

如果没有可重复的数据,您似乎想使用 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)

【讨论】:

  • 感谢您的回复!但是,尝试使用 pivot_longer() 函数时出现错误。它未被识别,我已尝试安装所需的软件包,但仍然出现错误。
  • pivot_longer() 需要tidyr 1.0.0,但您可以尝试用已弃用的gather() 替换这段代码:gather(-PATDEID,-visit,key = 'drug',values = '正面)
【解决方案2】:

如果我让你正确,你只需要总结每个病人,所有非零条目。所以这是一个拆分数据框(没有 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 函数进行总结:

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”函数采用矩阵或 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多