2016-08-17 3 views
0

Мои данные (образец) выглядят следующим образом:Условный перекодировать и сумма в R

mydata <- structure(list(x1 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), x2 = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 4L, 4L), x3 = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 4L, 5L, 2L, 
1L, 5L, 6L, 6L), week = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 30L, 50L, 
22L, 52L, 36L, 25L, 26L), newar1 = c(0L, 0L, 2L, 0L, 0L, 2L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), newvar2 = c(0L, 2L, 0L, 0L, 
2L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("x1", "x2", 
"x3", "week", "newar1", "newvar2"), class = "data.frame", row.names = c(NA, 
-14L)) 



x1 x2 x3 week 
0 1 1 0 
0 2 3 0 
0 3 5 0 
0 1 1 0 
0 2 3 0 
0 3 5 0 
1 1 1 1 
1 2 4 30 
1 3 5 50 
1 1 2 22 
1 2 1 52 
1 3 5 36 
1 4 6 25 
1 4 6 26 

Я хотел бы создать 1 новую переменную newvar1:

  • если x1 = 0 => Я бы например, подсчитывать количество раз во всем наборе данных, где x1 равно 1 (только другие строки, исключая собственное наблюдение), но только подсчитывать строки с той же комбинацией x2 и x3 и строк, где число недели больше 24.

  • if x1 = 1 => Я хотел бы подсчитать количество раз во всем наборе данных, где x1 равно 1, но только подсчитывать строки с той же комбинацией x2 и x3 и строк, где число недели минус 25 больше нуля ((неделя-25)> 0)).

Под «sum» Я имею в виду, что количество раз x1 равно 1, если условия сохраняются.

Под «if» Я имею в виду, что я хочу только суммировать x1, когда выполняются условия, следующие за удержанием. В основном мой вопрос: как я могу суммировать определенные значения на основе условий?

Мои данные должны выглядеть следующим образом:

x1 x2 x3 week newvar1 
0 1 1 0 0  
0 2 3 0 0  
0 3 5 0 2  
0 1 1 0 0  
0 2 3 0 0  
0 3 5 0 2  
1 1 1 1 0  
1 2 4 30 0  
1 3 5 50 1  
1 1 2 22 0  
1 2 1 52 0  
1 3 5 36 0  
1 4 6 25 0  
1 4 6 26 1  

В настоящее время у меня есть следующий код, но это не учитывает ограничений на x2=x3 и на неделю. Любые предложения, как это сделать?

mydata[,newvar1:=sum(x1), by=list(x2,x3)] 
+0

Пожалуйста, используйте dput() для обеспечения воспроизводимого примера –

+0

Включено, спасибо. – research111

+2

У меня возникли проблемы с пониманием критериев для 'newvar1' и' newvar2'. – jdobres

ответ

0

Я думаю, что мы можем использовать for цикл, чтобы получить это сделано:

for(i in 1:nrow(mydata)){ 
if(mydata[i,1] == 0){ # x1 == 0 
    mydata[i,]$newvar1 = 
    sum(mydata[-i,1] == 1 & # count where x1 == 1 
     mydata[i,2] == mydata[-i,2] & # and where (x2 == x2) & (x3 == x3) 
     mydata[i,3] == mydata[-i,3] & 
     mydata[-i,4] > 24) # and week > 24 
}else{ # x1 == 1 
    mydata[i,]$newvar1 = 
     sum(mydata[-i,1] == 1 & # count where x1 == 1 
      mydata[i,2] == mydata[-i,2] & # and where (x2 == x2) & (x3 == x3) 
      mydata[i,3] == mydata[-i,3] & 
      mydata[-i,4] > 25) # and week > 25 
    } 
} 

# mydata 
# x1 x2 x3 week newvar1 
# 1 0 1 1 0  0 
# 2 0 2 3 0  0 
# 3 0 3 5 0  2 
# 4 0 1 1 0  0 
# 5 0 2 3 0  0 
# 6 0 3 5 0  2 
# 7 1 1 1 1  0 
# 8 1 2 4 30  0 
# 9 1 3 5 50  1 
# 10 1 1 2 22  0 
# 11 1 2 1 52  0 
# 12 1 3 5 36  1 
# 13 1 4 6 25  1 
# 14 1 4 6 26  0 

В качестве альтернативы, если для x1 == 1 вы хотите сравнить данные по все строки:

for(i in 1:nrow(mydata)){ 
    if(mydata[i,1] == 0){ # x1 == 0 
     mydata[i,]$newvar1 = 
      sum(mydata[-i,1] == 1 & #count where x1 = 1 
        mydata[i,2] == mydata[-i,2] & # and where (x2 == x2) & (x3 == x3) 
        mydata[i,3] == mydata[-i,3] & 
        mydata[-i,4] > 24) # and week > 24 
    }else{ 
     mydata[i,]$newvar1 = 
      sum(mydata[,1] == 1 & 
       mydata[i,2] == mydata[,2] & 
       mydata[i,3] == mydata[,3] & 
       mydata[,4] > 25) 
    } 
} 

# mydata 
# x1 x2 x3 week newvar1 
# 1 0 1 1 0  0 
# 2 0 2 3 0  0 
# 3 0 3 5 0  2 
# 4 0 1 1 0  0 
# 5 0 2 3 0  0 
# 6 0 3 5 0  2 
# 7 1 1 1 1  0 
# 8 1 2 4 30  1 
# 9 1 3 5 50  2 
# 10 1 1 2 22  0 
# 11 1 2 1 52  1 
# 12 1 3 5 36  2 
# 13 1 4 6 25  1 
# 14 1 4 6 26  1 
0
mydata$newvar1 <- ifelse(mydata$x1==0, sapply(seq_len(nrow(mydata)), function(i) with (mydata, sum(x1[week > 25 & x2==x2[i] & x3==x3[i]]))), 0) 
mydata$newvar1 <- ifelse(mydata$x1==1, sapply(seq_len(nrow(mydata)), function(i) with (mydata, sum(x1[week < week[i] & week[i]!=0 & week-week[i]<25 & x2==x2[i] & x3==x3[i]]))), mydata$newvar1) 
0

Использование dplyr:

library(dplyr) 
mydata %>% group_by(x2, x3) %>% 
    mutate(newvar1 = ifelse(x1 == 0, 
          sum(x1 * week > 24), 
          sum(x1 * week > 25) - (week > 25) * (x1 == 1))) 
# Source: local data frame [14 x 6] 
# Groups: x2, x3 [7] 
# 
#  x1 x2 x3 week newvar2 newvar1 
# <int> <int> <int> <int> <int> <int> 
# 1  0  1  1  0  0  0 
# 2  0  2  3  0  2  0 
# 3  0  3  5  0  0  2 
# 4  0  1  1  0  0  0 
# 5  0  2  3  0  2  0 
# 6  0  3  5  0  0  2 
# 7  1  1  1  1  0  0 
# 8  1  2  4 30  0  0 
# 9  1  3  5 50  1  1 
# 10  1  1  2 22  0  0 
# 11  1  2  1 52  0  0 
# 12  1  3  5 36  0  1 
# 13  1  4  6 25  0  1 
# 14  1  4  6 26  0  0 

Странная бит в состоянии else, - (week > 25) * (x1 == 1), чтобы вычесть 1 из строк, которые в противном случае соответствуют бы сами.

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