在科學研究中免不了和數據打交道,收集到原始數據后我們經常需要對其進行清洗、轉換才能得到我們需要的數據。
今天我總結了一下自己常用的一些多條件的數據轉換方法,在臨床中遇到問題能多一種選擇,下面視頻操作演示一下
總結R語言常用的幾種按條件轉換數據的方法
代碼:
library(survival)
library(foreign)
bc <- read.spss("E:/r/test/Breast cancer survival agec.sav",use.value.labels=F, to.data.frame=T)
# 這是個乳腺癌患者的生存數據,age表示年齡,pathsize表示病理腫瘤大小(厘米),lnpos表示腋窩淋巴結陽性,
# histgrad表示病理組織學等級,er表示雌激素受體狀態,pr表示孕激素受體狀態,status結局事件是否死亡,
# pathscat表示病理腫瘤大小類別(分組變量),ln_yesno表示是否有淋巴結腫大,
# time是生存時間,后面的agec是我們自己設定的,不用管它。#分類變量轉成因子
bc$histgrad<-as.factor(bc$histgrad)
bc$er<-as.factor(bc$er)
bc$pr<-as.factor(bc$pr)
bc$ln_yesno<-as.factor(bc$ln_yesno)
names(bc)
bc <- na.omit(bc)# 假設我們想把年齡這個指標分成4個等分,然后比較不同年齡組的組間趨勢P for trend,就是年齡分組對死亡率的影響。
# 按照上一篇文章《手把手教你R語言計算校正混雜因素后的P for trend》的方法之一,要算出每組年齡段患者的中位數值。
# 我們先按年齡通過百分比0-25%,25%-50%,50%-70%,70%-100%這個比較把年齡分為4個區間age3<-quantile(bc$age,c(0,.25,.50,.75,1))
age2<-cut(bc$age,breaks=c(age3),include.lowest=T,labels = c(0,1,2,3))#把age劃分為4個等分到區間
bc$age2<-age2# 我們已經生成了年齡分段組(上圖age2),我們接下來進行今天的主要內容:分別計算出每個分段的age2的中位數值,啥意思的呢?
# 就是age2等于0的這一組age(年齡)的中位數,然后age2等于1的這一組age(年齡)的中位數,如此類推。這就涉及到了變量的按條件轉換。#1.subset函數
subset(bc$age,bc$age2==0)median(subset(bc$age,bc$age2==0))
median(subset(bc$age,bc$age2==0))
median(subset(bc$age,bc$age2==1))
median(subset(bc$age,bc$age2==2))
median(subset(bc$age,bc$age2==3))#2. which函數
which(bc$age2==0)bc[,"age"][which(bc[,"age2"]==0)]
median(bc[,"age"][which(bc[,"age2"]==0)])#3. with函數與by函數結合
newcode<-with(bc,by(age,age2,median))#4. tapply函數attach(bc)
tapply(age,age2, median)#5. dplyr包的分組摘要函數(group_by和summarize函數)
library(dplyr)
by_age<-group_by(bc,age2)
summarize(by_age,mid=median(age)) bc %>% group_by(age2)%>% summarize(mid=median(age))#6. select函數
select(filter(bc,age2 == 0),age)$age
median(select(filter(bc,age2 == 0),age)$age)#7.自己寫個funtion#可以加深對函數的理解datamedian<-function(data,x,group){attach(data)m<-levels(group)n<-length(m)newcode<-median(subset(x,group==m[1]))if (n>2){for (i in 2:n){newcode1<-median(subset(x,group==levels(group)[i]))newcode<-append(newcode,newcode1)}}return(newcode)
} datamedian(data = bc,x=age,group=age2)