2016-03-25 1 views
0

marital,genderおよびage(たとえばMM32)の連結であるclass変数を持っています。ビニング文字変数

Class ClassGrp 
SM20 SM20-25 
SM21 SM20-25 
SM22 SM20-25 
MF20 MF20-25 
MF21 MF20-25 
SF30 SF26-30 
SF31 SF31-35 

私はagegenderのための個別の列を持っている、とmaritalはので、私の最初のプロセスはとてもcut(data$Class, breaks = 10)ようcut機能によってageを破ることだった。私は彼らが最終的な出力は次のようになるのグループにしたいと思います。しかし、私はそれらを20-25形式に変換する方法について考えることはできません。

EDIT

入力データ

data <- structure(list(age = c(19L, 20L, 20L, 21L, 21L, 22L), gender = structure(c(2L, 
1L, 2L, 1L, 2L, 1L), .Label = c("Female", "Male"), class = "factor"), 
    marital = structure(c(3L, 3L, 3L, 3L, 3L, 2L), .Label = c("Divorced", 
    "Married", "Single", "Widowed"), class = "factor"), class = c("SM19", 
    "SF20", "SM20", "SF21", "SM21", "MF22"), ageGrp = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("(18.9,25]", "(25,31]", "(31,37]", 
    "(37,43]", "(43,49]", "(49,55]", "(55,61]", "(61,67]", "(67,73]", 
    "(73,79.1]"), class = "factor")), .Names = c("age", "gender", 
"marital", "class", "ageGrp"), row.names = c(NA, 6L), class = "data.frame") 
+0

を、あなたの入力の例を与えることができます。 – steveb

+0

ClassGrpのGrp部分はどこから来たのですか?あなたの質問の上部にある例では、20-25,26-30などですが、入力データにはすべて同じ年齢GP(18.9 - 25)があります。 ageGrpはGrpの部分ですか? –

+0

@ Hack-Rよく、私は20-25、26-30などでそれを持っていたいと思いますが、私が 'cut'関数を使用するとき、私はブレークの数を制御できるようです。それは私が望むものではないので、 'ageGrp'を無視することができます。 – Ken

答えて

1

あなたがソートされた配列としてあなたの出力ビンを定義し、値が1より(は以上含まれる場合チェックして、より小さくすることができます以下)。

あなたの値がビンから外れる可能性がある場合(つまり、最小値よりも小さくてもよいし、最大値よりも大きい場合もあります)、コントロールチェックを追加しました。

# Important: they should be ordered!                                                                       "marital", "class", "ageGrp"), row.names = c(NA, 6L), class = "data.frame") 
my.bins <- c(20, 25, 30, 35, 40, 50, 65) 

# Transform into bins 
to.bin <- function(class) { 
    gender.marital <- substring(class, 1, 2) 
    age <- as.numeric(substring(class, 3)) 
    # Check the boundaries 
    if (age < min(my.bins)) { 
    return(paste0(gender.marital, "<", min(my.bins))) 
    } else if (age >= max(my.bins)) { 
    return(paste0(gender.marital, ">=", max(my.bins))) 
    } 
    lower <- which(my.bins > age)[1] 
    return(paste0(gender.marital, my.bins[lower - 1], "-", my.bins[lower] - 1)) 
} 

data$ClassGrp <- sapply(data$class, to.bin) 
data 

コードは、あなたのデータでこれを返す:

age gender marital class ageGrp ClassGrp 
1 19 Male Single SM19 (18.9,25] SM<20 
2 20 Female Single SF20 (18.9,25] SF20-24 
3 20 Male Single SM20 (18.9,25] SM20-24 
4 21 Female Single SF21 (18.9,25] SF20-24 
5 21 Male Single SM21 (18.9,25] SM20-24 
6 22 Female Married MF22 (18.9,25] MF20-24 
1
# Read data 
x <- read.table(file = "clipboard") 

# Show the data I read in 
x 

# Bin the data as requested 
x$ClassGrp <- as.character(x$ageGrp) 
x$ClassGrp <- gsub("\\(", "", x$ClassGrp) 
x$ClassGrp <- gsub("\\]", "", x$ClassGrp) 
x$ClassGrp <- gsub(",", "-", x$ClassGrp) 
x$ClassGrp <- gsub("18.9", "19", x$ClassGrp) 
x$g  <- "M" 

x$g[x$gender == "Female"] <- "F" 
x$m <- "S" 
x$m[x$marital == "Married"] <- "M" 

for(i in 1:nrow(x)){ 
    x$ClassGrp[i] <- paste(x$g[i],x$m[i],x$ClassGrp[i], collapse="", sep="") 
} 


x$g <- NULL 
x$m <- NULL 

# Show results 
x 

    age gender marital class ageGrp ClassGrp 
1 19 Male Single SM19 (18.9,25] MS19-25 
2 20 Female Single SF20 (18.9,25] FS19-25 
3 20 Male Single SM20 (18.9,25] MS19-25 
4 21 Female Single SF21 (18.9,25] FS19-25 
5 21 Male Single SM21 (18.9,25] MS19-25 
6 22 Female Married MF22 (18.9,25] FM19-25 
7 22 Female Single SF22 (18.9,25] FS19-25 
8 22 Male Married MM22 (18.9,25] MM19-25 
9 22 Male Single SM22 (18.9,25] MS19-25 
10 23 Female Married MF23 (18.9,25] FM19-25