1

免責事項: 「崩壊」という言葉がこの操作に適しているかどうかはわかりません。より適切な用語があれば、私はすべて耳にします。

私は、長期にわたる複数の観察から、数百人の患者の症状の重症度に関するデータを持っています。重大度は序数スケールで定義されます。簡単な例を次に示します。

# Create example dataset
example.dat <- data.frame(
  ID = c(1,1,1,2,2,2,3,3,3,4,4,4),  # patient ID numbers
  Time = c("T1", "T2", "T3", "T1", "T2", "T3",  # times at which data were collected
           "T1", "T2", "T3", "T1", "T2", "T3"),
  Severity = c("Mild", "Moderate", "Mild",  # severity of symptoms
          "Severe", "Severe", "Moderate",
          "None", NA, "None",
          "Moderate", "Moderate", "Mild")
)

# Specify the order of the factor levels
example.dat$Severity <- ordered(example.dat$Severity,
                                levels = c("None",
                                           "Mild",
                                           "Moderate",
                                           "Severe")
                                )

example.dat

結果のデータ フレームは次のようになります。

   ID Time Severity
1   1   T1     Mild
2   1   T2 Moderate
3   1   T3     Mild
4   2   T1   Severe
5   2   T2   Severe
6   2   T3 Moderate
7   3   T1     None
8   3   T2     <NA>
9   3   T3     None
10  4   T1 Moderate
11  4   T2 Moderate
12  4   T3     Mild

ID ごとに観察された最も深刻な症状 (つまり、順序付けられた因子の最高レベル) を含む新しい列を作成したいと思います。これは次のようになります。

   ID Time Severity    Worst
1   1   T1     Mild Moderate
2   1   T2 Moderate Moderate
3   1   T3     Mild Moderate
4   2   T1   Severe   Severe
5   2   T2   Severe   Severe
6   2   T3 Moderate   Severe
7   3   T1     None     None
8   3   T2     <NA>     None
9   3   T3     None     None
10  4   T1 Moderate Moderate
11  4   T2 Moderate Moderate
12  4   T3     Mild Moderate

そこから簡単にサブセット化してこのデータ フレームを作成できます。このデータ フレームには、ID ごとに、最新の観測時刻と調査期間中に報告された最悪の症状が含まれます。

   ID Time    Worst
3   1   T3 Moderate
6   2   T3   Severe
9   3   T3     None
12  4   T3 Moderate

何かご意見は?

4

3 に答える 3

2

id を使用して、最大/最も深刻な症状を見つけることができますave

example.dat$Worst <- ave(example.dat$Severity, example.dat$ID, 
                                      FUN = function(i) max(i, na.rm=TRUE)) 

このna.rmオプションは、一部の ID の値が欠落しているため使用されます

その後、最新の時刻のみを保持するようにサブセット化できます。

于 2014-07-28T22:18:17.730 に答える
1

使用するdplyr

library(dplyr)
 res <- example.dat %>%
 group_by(ID) %>% 
 mutate(Worst=Severity[which.max(Severity)])

res
#Source: local data frame [12 x 4]
# Groups: ID

#    ID Time Severity    Worst
# 1   1   T1     Mild Moderate
# 2   1   T2 Moderate Moderate
# 3   1   T3     Mild Moderate
# 4   2   T1   Severe   Severe
# 5   2   T2   Severe   Severe
# 6   2   T3 Moderate   Severe
# 7   3   T1     None     None
# 8   3   T2       NA     None
# 9   3   T3     None     None
# 10  4   T1 Moderate Moderate
# 11  4   T2 Moderate Moderate
# 12  4   T3     Mild Moderate

 filter(res, Time=="T3") %>% select(-Severity)
#Source: local data frame [4 x 4]
#Groups: ID
#   ID Time    Worst
# 1  1   T3 Moderate
# 2  2   T3   Severe
# 3  3   T3     None
# 4  4   T3 Moderate

またはdata.table

library(data.table) ## 1.9.3
setDT(example.dat)[,Worst := Severity[which.max(Severity)], by=ID]    
example.dat

最新バージョンの 1.9.3 は、こちらから入手できます。代わりに CRAN バージョン 1.9.2 を使用したい場合は、1.9.3 で修正された小さなバグに対処する必要があります。

library(data.table) ## 1.9.2 from CRAN
setDT(example.dat)[, Worst := as.character(Severity)]
example.dat[, Worst := Worst[which.max(Severity)], by=ID]

データセットがすでに によって順序付けられていると仮定するとID,Time、これにより最終的なソリューションが直接得られます。

require(data.table) ## 1.9.3
setDT(example.dat)[, list(Time=Time[.N], Worst=Severity[which.max(Severity)]), by=ID]
#    ID Time    Worst
# 1:  1   T3 Moderate
# 2:  2   T3   Severe
# 3:  3   T3     None
# 4:  4   T3 Moderate

setDTdata.frame を data.table に変換します。次に、そのグループ内の観測数を保持する長さ 1 の整数ベクトルを使用してグループ化し、そのグループ内IDの最後の値を取得します。同様に、対応する maximum をサブセット化します。Time.NSeverity

于 2014-07-29T07:55:13.850 に答える