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

編集:

それで、もう一つ。1つの日付が欠落している場合はどうなりますか...したがって:

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"
4

2 に答える 2

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" 
于 2013-01-03T03:32:05.913 に答える
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"
于 2013-01-03T01:04:12.263 に答える