2013-02-11 2 views
0
   id time bord sex pbirth 
       132 1255 1 Female  17 
       132 1288 0  0  33 
       172 985 1 Female  24 
       172 1016 2 Female  31 
       172 1054 3 Male  38 
       172 1288 0  0 234 

Но, хочу найти эти данные. Где я хочу добавить две новые переменные, обучаясь сексу. Если секс равен Женщине подряд, то в следующем ряду nfemale=1 и если пол равен Мужской в ​​строке, то в следующем ряду nmale=1. Он разделит данные по id.R: Для расчета новой переменной R код

   id time bord sex pbirth nfemale nmale 
       132 1255 1 Female  17 0  0 
       132 1288 0  0  33 1  0 
       172 985 1 Female  24 0  0 
       172 1016 2 Female  31 1  0 
       172 1054 3 Male  38 2  0 
       172 1288 0  0 234 2  1 

По R-коду. Где, sex=0, означает отсутствующее значение/отсутствие наблюдения, nfemale = Нет. женщины до этого момента времени и nmale = Нет. женщин до этого момента

+2

вопрос не ясен. перефразируйте его должным образом. –

+0

Я бы предложил использовать 'NA' not' 0' для определения отсутствующих значений. –

+0

Я думаю, что OP - это «cumsum» для отдельного пола/пола. –

ответ

3
dat$nfemale <- cumsum(c(0, dat$sex[1:(nrow(dat)-1)] =="Female")) 
dat$nmale <- cumsum(c(0, dat$sex[1:(nrow(dat)-1)] =="Male")) 
dat 
#----- 
    id time bord sex pbirth nfemale nmale 
1 132 1255 1 Female  17  0  0 
2 132 1288 0  0  33  1  0 
3 172 985 1 Female  24  1  0 
4 172 1016 2 Female  31  2  0 
5 172 1054 3 Male  38  3  0 
6 172 1288 0  0 234  3  1 

Действовать в рамках категорий, было очевидно, только в качестве примера и не в sescription:

temp <- do.call(rbind, by(dat, dat$id, 
    function(d) data.frame(nfemale=cumsum(c(0, d$sex[1:(nrow(d)-1)] =="Female")), 
          nmale=cumsum(c(0, d$sex[1:(nrow(d)-1)] =="Male"))))) 
     nfemale nmale 
132.1  0  0 
132.2  1  0 
172.1  0  0 
172.2  1  0 
172.3  2  0 
172.4  2  1 

cbind(dat, temp) 
4

Вы можете использовать функцию ddply из пакета plyr. Предполагая dat это имя вашего фрейма данных:

library(plyr) 
ddply(dat, .(id), transform, 
     nFemale = c(0, head(cumsum(sex == "Female"), -1)), 
     nMale = c(0, head(cumsum(sex == "Male"), -1))) 

    id time bord sex pbirth nFemale nMale 
1 132 1255 1 Female  17  0  0 
2 132 1288 0  0  33  1  0 
3 172 985 1 Female  24  0  0 
4 172 1016 2 Female  31  1  0 
5 172 1054 3 Male  38  2  0 
6 172 1288 0  0 234  2  1 
+0

Я использовал тот же базовый подход в базе +1 –

3

Возвращаясь сюда мое решение воняет но я все равно его выброшу (хорошая работа DWin):

L1 <- split(dat, dat$id) 
do.call(rbind.data.frame, lapply(L1, function(x){ 
    x[, "nfemale"] <- c(0, head(cumsum(x[, "sex"] == "Female"), -1)) 
    x[, "nmale"] <- c(0, head(cumsum(x[, "sex"] == "Male"), -1)) 
    x 
})) 
+0

Ну, ваш раскол по 'id', мой не ... еще. –

Смежные вопросы