我正在为我的统计计算课做一个项目,我正在努力解决这个项目。我有一个数据集,其中包括患者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)发布于 2019-11-18 09:05:40
如果没有可重现的数据,看起来你想要使用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)发布于 2019-11-20 01:08:24
如果我没记错,你只需要把每个病人的所有非零条目加起来就行了。因此,问题是拆分数据框(不包括ID和week列),然后进行求和。
首先,我模拟一些看起来像您的数据:
#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")现在,如前所述,您可以使用base 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))https://stackoverflow.com/questions/58906701
复制相似问题