3

私はRを初めて使用します。私の問題は次のとおりです。

このような時系列として編成された一連のパネル データがあります (一部のみが表示されます)。

Week_Starting    Team A            Team B      Team C   Team D              
2010-01-02         1                   2           3        4
2010-01-09         2                  40           1        5
2010-01-16        15                <NA>           4       11
2010-01-23        25                <NA>           7       18
2010-01-30        38                <NA>           9       29
2010-02-06      <NA>                <NA>          12       34
2010-02-13      <NA>                <NA>          16       40
2010-02-20      <NA>                <NA>          20     <NA>
2010-02-27      <NA>                <NA>          15       28
2010-03-06      <NA>                <NA>          20     <NA>
2010-03-13      <NA>                <NA>          24     <NA>
2010-03-20      <NA>                <NA>          24     <NA>
2010-03-27      <NA>                <NA>          21     <NA>
2010-04-03      <NA>                <NA>          27     <NA>
2010-04-10      <NA>                <NA>          24     <NA>
2010-04-17      <NA>                <NA>          25     <NA>
2010-04-24      <NA>                <NA>          35     <NA>
2010-05-01      <NA>                <NA>          40     <NA>
2010-05-08      <NA>                <NA>          32     <NA>
2010-05-15      <NA>                <NA>        <NA>     <NA>
2010-05-22      <NA>                <NA>          39     <NA>

たとえばチーム B を使用するのは、観測の欠落が多すぎるため意味がありません。ランキング システムは、40 未満のランキングのデータを提供しません。そのため、少なくとも 8 週間の連続観測がない列 (変数) を削除して、クリーンアップしたいと考えています (この例では、チーム A、B、D など)。したがって、D は 2010 年 2 月 20 日から始まる週にギャップがあるため、要件を満たしていません。1000以上の列を取得したことに注意してください。

以前にこれを試しましたが、必要なものが得られず、残念ながら、必要に応じてコードを変更するスキルがありません。

私が考えることができるいくつかの可能な解決策:

  1. 8 つ以上の連続した観測値を持つ各変数の部分をサブセット化する

  2. 観測値 = NA を設定 8 個の obs の連続実行に NA が含まれる場合、NA のみを持つ列を削除します。これは、最小 8 週間の要件を満たさない列には NA 値しか含まれないためです (意味が理解できると思います)。

興味深いことに、データが長い形式で編成されている場合、同じことを行うのはより難しくなりますか?

#Using MrFlick's data frame

melt(dd,id="Week_Starting")

       Week_Starting variable value
    1     2010-01-02   Team_A     1
    2     2010-01-09   Team_A     2
    3     2010-01-16   Team_A    15
    4     2010-01-23   Team_A    25
    5     2010-01-30   Team_A    38
    6     2010-02-06   Team_A    NA
    7     2010-02-13   Team_A    NA
    8     2010-02-20   Team_A    NA
    9     2010-02-27   Team_A    NA
    10    2010-03-06   Team_A    NA
    11    2010-03-13   Team_A    NA
    12    2010-03-20   Team_A    NA
    13    2010-03-27   Team_A    NA
    14    2010-04-03   Team_A    NA
    15    2010-04-10   Team_A    NA
    16    2010-04-17   Team_A    NA
    17    2010-04-24   Team_A    NA
    18    2010-05-01   Team_A    NA
    19    2010-05-08   Team_A    NA
    20    2010-05-15   Team_A    NA
    21    2010-05-22   Team_A    NA
    22    2010-01-02   Team_B     2
    23    2010-01-09   Team_B    40
    24    2010-01-16   Team_B    NA
    25    2010-01-23   Team_B    NA
    26    2010-01-30   Team_B    NA
    27    2010-02-06   Team_B    NA
    28    2010-02-13   Team_B    NA
    29    2010-02-20   Team_B    NA
    30    2010-02-27   Team_B    NA
    31    2010-03-06   Team_B    NA
    32    2010-03-13   Team_B    NA
    33    2010-03-20   Team_B    NA
    34    2010-03-27   Team_B    NA
    35    2010-04-03   Team_B    NA
    36    2010-04-10   Team_B    NA
    37    2010-04-17   Team_B    NA
    38    2010-04-24   Team_B    NA
    39    2010-05-01   Team_B    NA
    40    2010-05-08   Team_B    NA
    41    2010-05-15   Team_B    NA
    42    2010-05-22   Team_B    NA
    43    2010-01-02   Team_C     3
    44    2010-01-09   Team_C     1
    45    2010-01-16   Team_C     4
    46    2010-01-23   Team_C     7
    47    2010-01-30   Team_C     9
    48    2010-02-06   Team_C    12
    49    2010-02-13   Team_C    16
    50    2010-02-20   Team_C    20
    51    2010-02-27   Team_C    15
    52    2010-03-06   Team_C    20
    53    2010-03-13   Team_C    24
    54    2010-03-20   Team_C    24
    55    2010-03-27   Team_C    21
    56    2010-04-03   Team_C    27
    57    2010-04-10   Team_C    24
    58    2010-04-17   Team_C    25
    59    2010-04-24   Team_C    35
    60    2010-05-01   Team_C    40
    61    2010-05-08   Team_C    32
    62    2010-05-15   Team_C    NA
    63    2010-05-22   Team_C    39
    64    2010-01-02   Team_D     4
    65    2010-01-09   Team_D     5
    66    2010-01-16   Team_D    11
    67    2010-01-23   Team_D    18
    68    2010-01-30   Team_D    29
    69    2010-02-06   Team_D    34
    70    2010-02-13   Team_D    40
    71    2010-02-20   Team_D    NA
    72    2010-02-27   Team_D    28
    73    2010-03-06   Team_D    NA
    74    2010-03-13   Team_D    NA
    75    2010-03-20   Team_D    NA
    76    2010-03-27   Team_D    NA
    77    2010-04-03   Team_D    NA
    78    2010-04-10   Team_D    NA
    79    2010-04-17   Team_D    NA
    80    2010-04-24   Team_D    NA
    81    2010-05-01   Team_D    NA
    82    2010-05-08   Team_D    NA
    83    2010-05-15   Team_D    NA
    84    2010-05-22   Team_D    NA

助言がありますか?

4

1 に答える 1

4

これを使用rleして、非 NA 値のランの長さを計算できます。まず、データをコピーして貼り付けることができる素敵な data.frame があります。

dd<-structure(list(Week_Starting = structure(1:21, .Label = c("2010-01-02", 
"2010-01-09", "2010-01-16", "2010-01-23", "2010-01-30", "2010-02-06", 
"2010-02-13", "2010-02-20", "2010-02-27", "2010-03-06", "2010-03-13", 
"2010-03-20", "2010-03-27", "2010-04-03", "2010-04-10", "2010-04-17", 
"2010-04-24", "2010-05-01", "2010-05-08", "2010-05-15", "2010-05-22"
), class = "factor"), Team_A = c(1L, 2L, 15L, 25L, 38L, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Team_B = c(2L, 
40L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA), Team_C = c(3L, 1L, 4L, 7L, 9L, 12L, 16L, 
20L, 15L, 20L, 24L, 24L, 21L, 27L, 24L, 25L, 35L, 40L, 32L, NA, 
39L), Team_D = c(4L, 5L, 11L, 18L, 29L, 34L, 40L, NA, 28L, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("Week_Starting", 
"Team_A", "Team_B", "Team_C", "Team_D"), class = "data.frame", row.names = c(NA, 
-21L))

次に、ベクトル内の非 NA 値の最長ランを計算できる関数を定義します。

consecnonNA <- function(x) {
    rr<-rle(is.na(x))
    max(rr$lengths[rr$values==FALSE])
}

各列のこの値を計算し、少なくとも 8 週間連続した列の名前を返すことができます。

atleast <- function(i) {function(x) x>=i}
hasatleast8 <- names(Filter(atleast(8), sapply(dd[,-1], consecnonNA)))

そして、サブセット化できます

dd[, c("Week_Starting", hasatleast8), drop=F]
于 2014-07-06T22:09:19.457 に答える