2017-10-17 5 views
0

私はhttps://www.kaggle.com/c/titanicからタイタニックデータセットを使用しています。Rでカスタム範囲でデータをグループ化する(例:0-4,1-5,2-6,3-7など)

"0-4"、 "1-5"、 "2-6"、 "3-7"などのように異なる年齢グループを作り、生存率が最高。私の年齢グループは整数間隔[0,80]内にあります。元のデータセットの「年齢」列には、NAsも含まれています。 「生存」の列には、生存しているかどうかの情報が含まれます(0 =いいえ、1 =はい)。

私はこのような問題を解決しようとしていましたが、うまくいかなかったのです。私はどんな助けにも感謝します。

for(i in 0:80){ 
max= -Inf 
x[i]<-(sum(subset(dataset, Age < (i+5) & Age >= i, select = "Survived")))/(length(which(dataset$Age < (i+5) & dataset$Age>= i))) 
if (x[i] > max) max <- x[i] 
return(max, i, i+5)} 
+0

あなたのグループは、「0-4」、「1-5」、「2-6」、「3-7」 '重複しています。 Age == 3の値はどのグループに入りますか? –

+0

はい、年齢== 3は複数の年齢層に分類されます。私はそれがばかげていることを理解する。しかし、ループを書くか、またはこのようなグループを持つテーブルを作成して、ステップ= 5のすべての年齢層の生存率を調べる可能性がある場合は、まだですか? – iomedee

答えて

1

まず、いくつかのデータを作成します。

set.seed(1234) # make it reproducible 
Age <- sample(c(NA, 1:80), 200, TRUE) 
Survived <- sample(0:1, 200, TRUE) 

コードが追加されました。グループへの入力をcutに、グループごとに機能するlapplyには、0から3までの関数を定義します。

fun <- function(i, x){ 
    as.character(cut(x, breaks = seq(i, 80, by = 5), include.lowest = TRUE)) 
} 

res <- unlist(lapply(0:3, fun, Age)) 
table(res) 

res_surv <- unlist(lapply(0:3, fun, Age[Survived == 1])) 
table(res_surv) 

あなたは割合にしたい場合は、あなたが

tbl_surv <- table(res_surv) 
100*tbl_surv/sum(tbl_surv) 
0

一つのアプローチでそれを行うことができますがグループにそれらを回し、その後、年齢によって、すべてを集計することです。次に、lag()関数を再帰的に使用して、5行の各セットを追加します。

library(dplyr) 

df %>% group_by(Age) %>% 
    summarize(n = n(), Survived = sum(Survived)) %>% 
    arrange(Age) %>% 
    mutate(Age_Group = paste0(Age-4, "-", Age)) %>% 
    mutate_at(vars(n, Survived), 
    funs(. + lag(.) + lag(lag(.)) + lag(lag(lag(.))) + lag(lag(lag(lag(.)))))) %>% 
    mutate(SurvivalRate = Survived/n) %>% 
    filter(!is.na(n)) %>% 
    select(-Age) 
1

OPが

に要求した生き残っの割合が最も高い年齢層を見つける:(df)のデータフレームを仮定すると、2つの列、AgeSurvived(0または1)を持っています

非エクイは結合を使用可能な一点の解決策があります:

library(data.table) 
library(titanic) 
dataset <- as.data.table(titanic_train) 
delta <- 4 
max_age <- 80 
dataset[ 
    .(lower = seq(0, max_age - delta), upper = seq(delta, max_age)), 
    on = .(Age >= lower, Age <= upper), .SD[, .N, by = Survived], by = .EACHI][ 
    , total.N := sum(N), by = Age][, share := N/total.N][] 
 Age Age Survived N total.N  share 
    1: 0 4  1 27  40 0.6750000 
    2: 0 4  0 13  40 0.3250000 
    3: 1 5  0 13  37 0.3513514 
    4: 1 5  1 24  37 0.6486486 
    5: 2 6  0 12  33 0.3636364 
---          
137: 72 76  0 1  1 1.0000000 
138: 73 77  0 1  1 1.0000000 
139: 74 78  0 1  1 1.0000000 
140: 75 79  NA 1  1 1.0000000 
141: 76 80  1 1  1 1.0000000 

結果は、これまで生き残った唯一の乗客との年齢層は100%の最高の生存率を有することを示しています。これは些細なことであり、おそらくOPが探している結果ではありません。 deltaのいずれかを拡大するか、または年齢グループごとの乗客の絶対数に関する閾値を適用する必要があります(例:total.N > 2)。

関連する問題