Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据日期对名称进行排序()_R_Sorting_Names - Fatal编程技术网

R 根据日期对名称进行排序()

R 根据日期对名称进行排序(),r,sorting,names,R,Sorting,Names,我试着根据R中各个列的日期对各个患者的列进行排序。我制作了一个示例数据集,但是,该数据集不返回日期,而是返回很长的数字(不知道为什么)。请原谅我创建数据帧的愚蠢方式:) 因此,缺少数据点的列名包含在末尾的日期排序列表中。但我希望它不在那里。。。因此: patient [1,] "1" "date1" "date2" "date4" "date3" [2,] "2" "date2" "date4" "date3"

我试着根据R中各个列的日期对各个患者的列进行排序。我制作了一个示例数据集,但是,该数据集不返回日期,而是返回很长的数字(不知道为什么)。请原谅我创建数据帧的愚蠢方式:)

因此,缺少数据点的列名包含在末尾的日期排序列表中。但我希望它不在那里。。。因此:

   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。。。评论中的格式很糟糕。。。我会填一个‘答案’啊,马修的答案给出了我需要的确切格式。一切都好。非常感谢你的帮助!