R 根据日期对名称进行排序()
我试着根据R中各个列的日期对各个患者的列进行排序。我制作了一个示例数据集,但是,该数据集不返回日期,而是返回很长的数字(不知道为什么)。请原谅我创建数据帧的愚蠢方式:) 因此,缺少数据点的列名包含在末尾的日期排序列表中。但我希望它不在那里。。。因此:R 根据日期对名称进行排序(),r,sorting,names,R,Sorting,Names,我试着根据R中各个列的日期对各个患者的列进行排序。我制作了一个示例数据集,但是,该数据集不返回日期,而是返回很长的数字(不知道为什么)。请原谅我创建数据帧的愚蠢方式:) 因此,缺少数据点的列名包含在末尾的日期排序列表中。但我希望它不在那里。。。因此: patient [1,] "1" "date1" "date2" "date4" "date3" [2,] "2" "date2" "date4" "date3"
patient
[1,] "1" "date1" "date2" "date4" "date3"
[2,] "2" "date2" "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")
)
by(dd,dd$patient,function(x) names(x[,order(x)]))
要编辑它以删除第一个“患者”列,这将起作用:
by(dd,dd$patient,function(x) c(x[,1],names(x[,order(x[,2:ncol(x)])])))
导致:
dd$patient: 1
[1] "patient" "date1" "date2" "date4" "date3"
------------------------------------------------------------
dd$patient: 2
[1] "patient" "date2" "date1" "date4" "date3"
dd$patient: 1
[1] "1" "date1" "date2" "date4" "date3"
------------------------------------------------------------------------------
dd$patient: 2
[1] "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")
)
by(dd,dd$patient,function(x) names(x[,order(x)]))
要编辑它以删除第一个“患者”列,这将起作用:
by(dd,dd$patient,function(x) c(x[,1],names(x[,order(x[,2:ncol(x)])])))
导致:
dd$patient: 1
[1] "patient" "date1" "date2" "date4" "date3"
------------------------------------------------------------
dd$patient: 2
[1] "patient" "date2" "date1" "date4" "date3"
dd$patient: 1
[1] "1" "date1" "date2" "date4" "date3"
------------------------------------------------------------------------------
dd$patient: 2
[1] "2" "date2" "date1" "date4" "date3"
下面是一个应用程序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"
下面是一个应用程序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"
当您没有时间组件时,为什么要使用POSIXct
?避免使用POSIXct
如果你不需要H:M:S,那么你很可能会遇到夏令时和时区的问题。当你没有时间组件时,为什么要使用POSIXct
?如果您不需要H:M:S,请避免使用POSIXct,否则您可能会遇到夏令时和时区的问题。太好了!这很好…但是,有没有办法只获取我感兴趣的行?我基本上需要一个病人编号表,后跟一系列列名(不是日期),我对实际日期不感兴趣。我可以在excel中对结果进行obv排序,但我想知道是否会有一个R-way@Luc-你对哪一行感兴趣?您的问题中没有引用特定行的选择。我不知道您在这里还要求什么。而不是:dd$patient:1[1]“patient”“date1”“date2”“date4”“date3”-------------------------------------------------dd$patient:2[1]“patient”“date2”“date1”“date4”“date3”只包含:patient1“date1”“date2”“date1”“date4”“date3”grrr。。。评论中的格式很糟糕。。。我会填一个‘答案’啊,马修的答案给出了我需要的确切格式。一切都好。非常感谢你的帮助!伟大的这很好…但是,有没有办法只获取我感兴趣的行?我基本上需要一个病人编号表,后跟一系列列名(不是日期),我对实际日期不感兴趣。我可以在excel中对结果进行obv排序,但我想知道是否会有一个R-way@Luc-你对哪一行感兴趣?您的问题中没有引用特定行的选择。我不知道您在这里还要求什么。而不是:dd$patient:1[1]“patient”“date1”“date2”“date4”“date3”-------------------------------------------------dd$patient:2[1]“patient”“date2”“date1”“date4”“date3”只包含:patient1“date1”“date2”“date1”“date4”“date3”grrr。。。评论中的格式很糟糕。。。我会填一个‘答案’啊,马修的答案给出了我需要的确切格式。一切都好。非常感谢你的帮助!