2013-01-03 76 views
0

我试图根据R中那些列中的日期对个别患者的列进行排序。我做了一个示例数据集,但是,数据集不会返回日期,而是长数字(不知道为什么)。请原谅我的创建数据帧的也许是可笑的方式:)...根据日期对名称()进行排序

dd<- 
data.frame(rbind(
c(as.POSIXct(as.Date("01/01/2008", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2009", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2011", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2010", format="%d/%m/%Y"))) 
, 
c(as.POSIXct(as.Date("01/01/2002", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2001", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2006", format="%d/%m/%Y")), 
as.POSIXct(as.Date("01/01/2004", format="%d/%m/%Y"))) 
)) 
dd$patient[1] <- 1 
dd$patient[2] <- 2 
names(dd) <- c("date1", "date2", "date3", "date4", "patient") 

什么我以后是每名患者科拉姆名,通过那些列中的日期排序列表。因此,

患者1:DATE1,DATE2,date4,DATE3

患者2:date2的,DATE1,date4,DATE3

编辑:

所以,还有一两件事。如果一个日期丢失了怎么办?这样的:

dd <- data.frame(
    patient = 1:2, 
    date1 = as.Date(c("01/01/2008","01/01/2002"),format="%d/%m/%Y"), 
    date2 = as.Date(c("01/01/2009","01/01/2001"),format="%d/%m/%Y"), 
    date3 = as.Date(c("01/01/2011","01/01/2006"),format="%d/%m/%Y"), 
    date4 = as.Date(c("01/01/2010","01/01/2004"),format="%d/%m/%Y") 
) 

dd[2,2]<- NA 

马修斯给出了答案:

> t(apply(dd, 1, function(x) c(x[1], names(x[-1])[order(x[-1])]))) 
    patient         
[1,] "1"  "date1" "date2" "date4" "date3" 
[2,] "2"  "date2" "date4" "date3" "date1" 

因此丢失的数据点的列名包括在结束日期的排序列表。但我还想它是不是有这样...:

patient         
[1,] "1"  "date1" "date2" "date4" "date3" 
[2,] "2"  "date2" "date4" "date3" 
+0

为什么在没有时间分量时使用'POSIXct'?如果您不需要H:M:S,请避免使用'POSIXct',否则您可能会遇到夏令时和时区问题。 –

回答

1

的另一种尝试使用by

dd <- data.frame(
    patient = 1:2, 
    date1 = as.Date(c("01/01/2008","01/01/2002"),format="%d/%m/%Y"), 
    date2 = as.Date(c("01/01/2009","01/01/2001"),format="%d/%m/%Y"), 
    date3 = as.Date(c("01/01/2011","01/01/2006"),format="%d/%m/%Y"), 
    date4 = as.Date(c("01/01/2010","01/01/2004"),format="%d/%m/%Y") 
) 

by(dd,dd$patient,function(x) names(x[,order(x)])) 

,导致:

dd$patient: 1 
[1] "patient" "date1" "date2" "date4" "date3" 
------------------------------------------------------------ 
dd$patient: 2 
[1] "patient" "date2" "date1" "date4" "date3" 

编辑它摆脱了第一个 “病人” 栏目,这将工作:

by(dd,dd$patient,function(x) c(x[,1],names(x[,order(x[,2:ncol(x)])]))) 

,导致:

dd$patient: 1 
[1] "1"  "date1" "date2" "date4" "date3" 
------------------------------------------------------------------------------ 
dd$patient: 2 
[1] "2"  "date2" "date1" "date4" "date3" 
+0

太棒了!这很好...但是,那么还有一种方法可以只获取我感兴趣的行吗?我基本上需要一个病人号码表,后面跟着一系列的列名(不是日期),我对实际日期不感兴趣。我可以obv排序在Excel中的结果,但我想知道是否会有一个R路 – Luc

+0

@Luc - 你对哪些行感兴趣?在引用特定行的选择的问题中没有任何东西。我不确定你在这里要求什么。 – thelatemail

+0

而不是:dd $ patient:1 [1]“patient”“date1”“date2”“date4”“date3”----------------------- ------------------------------------- dd $ patient:2 [1]“patient”“date2 “date1”“date4”“date3”只有:patient1“date1”“date2”“date4”“date3”patient2“date2”“date1”“date4”“date3” – Luc

2

这里的应用apply来遍历数据帧:

t(apply(dd, 1, function(x) c(x[length(x)], names(x)[order(x[-length(x)])]))) 

##  patient         
## [1,] "1"  "date1" "date2" "date4" "date3" 
## [2,] "2"  "date2" "date1" "date4" "date3" 

如果patient是第一列,而不是最后一列,则可能更有意义。

使用@ thelatemail的定义,而不是你的:

t(apply(dd, 1, function(x) c(x[1], names(x[-1])[order(x[-1])]))) 

##  patient         
## [1,] "1"  "date1" "date2" "date4" "date3" 
## [2,] "2"  "date2" "date1" "date4" "date3" 

所编辑的问题,你不能代表它在数据帧或矩阵,除非你使用NA的缺失值,这将是合理。但是,下面是如何获得一个列表作为返回值,因为列表可以具有可变长度条目:

apply(dd, 1, function(x) c(x[1], names(x[-1][!is.na(x[-1])])[order(x[-1][!is.na(x[-1])])])) 

## [[1]] 
## patient         
##  "1" "date1" "date2" "date4" "date3" 
## 
## [[2]] 
## patient       
##  "2" "date2" "date4" "date3" 
相关问题