R - R

2017-04-21 3 views
0
date  A B C 
11/24/2016 0 -1 -1 
11/23/2016 -1 -1 -1 
11/22/2016 0 -1 -1 
11/21/2016 0 -1 -1 
11/18/2016 -1 -1 -1 
11/17/2016 -1 -1 -1 
11/16/2016 -1 -1 -1 
11/15/2016 -1 -1 -1 
11/14/2016 -1 -1 -1 
11/11/2016 -1 -1 -1 
11/10/2016 0 -1 0 
11/9/2016 0 -1 0 

엑셀 명령 엑셀에서 IF 복제() 논리 명령 C=IF(A2=-1, -1, IF(AND(B2=-1,C3=-1),-1,0)) 때문이다 (데이터는 ROW2 가정에서 시작). 따라서 기본적으로 열 A가 -1이면 열 C도 -1이됩니다. 그렇지 않으면 B2=-1인지 확인하고 C 아래의 행이 -1인지 확인합니다. Excel에서 수식을 복사/붙여 넣기 만하면 C가 자동으로 업데이트됩니다.R - R

R에서는 col AB에 대한 값이 있으며이 열을 사용하여 Excel을 통해 수행 한 방법과 마찬가지로 C을 만들려고합니다. 그러나, 나는 꽤 오랫동안 이것을하는 방법에 대해 생각 붙어 있었어요. 이것은 'C'가 'A'에 의존하고, 실패하면 'B'와 그 자체의 지체 값에 의존하기 때문입니다. 도움을 많이 주시면 감사하겠습니다!

편집 : 나는 아마도 작동 할 수있는 것을 염두에두고 있습니다.

for (i in 1:length(dat[,1])){ 

     dat[i,3] <- ifelse(dat[i,1]==-1, -1, 0) 

     } 

첫 번째 루프를 실행 한 후, 내가 얻을 : 두 번째 조건 이제

A B V3 
1 0 -1 0 
2 -1 -1 -1 
3 0 -1 0 
4 0 -1 0 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 -1 
11 0 -1 0 
12 0 -1 0 

: 두 번째 조건

for (i in 2:length(dat[,1])){ 

     dat[i-1,3] <- ifelse(dat[i-1,2]==-1&dat[i,3]==-1, -1, dat[i,3]) 

     } 

, 내가 for() 확인할 것을 바라고 있어요 앞의 행과 -1을 반복적으로 채우십시오. 현재 C에서 행 앞에 -1이 있고가있는 한 그러나 B의 현재 행에 10 일,이 반환 끝 : row3 -1로 채워진 얻을 수 있도록

A B V3 
1 0 -1 -1 
2 -1 -1 0 
3 0 -1 0 
4 0 -1 -1 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 0 
11 0 -1 0 
12 0 -1 0 

내가, -1로 유지하는 row2이 필요합니다.

+2

그래서'C' 열의 값은 이미 있습니까? –

+0

@Ronak Shah 죄송합니다! 명확히해야합니다. 저는 R에서'A'와'B'에 대한 값을 가지고 있습니다. Excel에서 어떻게했는지'C '를 만들기 위해 그것들을 사용하고 싶습니다. 내 게시물을 편집 할 것입니다! – Nikitau

+0

'dplyr :: case_when'은 그 말 그대로 처리합니다 :'library (dplyr); (C == -1 ~ -1, TRUE ~ 0))'그렇지 않으면 중첩 된 ifelse를 사용할 수있다. '호출하지만, 그것은 지저분해진다. – alistaire

답변

0

당신은 R에서 'ifelse'기능을 사용할 수 있습니다

x<-data.set.name 
y<-ifelse(x$A==-1,-1,ifelse(x$B==-1 & X$C==-1,-1,0)) 

이 그것을해야한다.

+1

다음 행에서'C' 값을 가져와야합니다. – alistaire

+0

안녕하세요, '납'또는 '지연'C 일 수 있다고 생각하십니까? 또한, 내가 겪고있는 문제는 'C'가 실제로 R에서 생성되지 않았다는 것입니다. Excel에서 수식을 복사/붙여 넣을 수 있었고 C 열을 자동으로 업데이트 할 수있었습니다. 나는 이것이 R에서 어떻게 작동 할지는 모르겠다. – Nikitau

+0

@alistaire 예. 그리고 문제를 복잡하게하기 위해 어떻게 든 R에서'C'를 생성해야합니다. – Nikitau

1

문제는 계산중인 값에서 다음 값을 그리기 때문에 아래쪽에서 계산을 시작해야합니다. 거기에서 값이 맨 위로 줄 수 있습니다. 이 모든 행에 대한 반복을 실행해야하기 때문에

df$C <- sapply(
    Reduce(
     function(x, y){ 
      if (x[[1]] == -1) { -1 } else if (x[[2]] == -1 & y[[1]] == -1) { -1 } else { 0 } 
     }, 
     Map(c, df$A, df$B), right = TRUE, accumulate = TRUE), 
    `[`, 1) 

df 
#>   date A B C 
#> 1 11/24/2016 0 -1 -1 
#> 2 11/23/2016 -1 -1 -1 
#> 3 11/22/2016 0 -1 -1 
#> 4 11/21/2016 0 -1 -1 
#> 5 11/18/2016 -1 -1 -1 
#> 6 11/17/2016 -1 -1 -1 
#> 7 11/16/2016 -1 -1 -1 
#> 8 11/15/2016 -1 -1 -1 
#> 9 11/14/2016 -1 -1 -1 
#> 10 11/11/2016 -1 -1 -1 
#> 11 11/10/2016 0 -1 0 
#> 12 11/9/2016 0 -1 0 

, 그것은 정말 빠르지 않을 것이다, 그러나 1K 행에 대해 잘 될 것입니다 : right = TRUEaccumulate = TRUEReduce는 논리를 만들 수 있습니다.

이 모든 논리는 의심 스럽습니다. 그리고 당신이 계산하는 것이 의미가 있는지를 신중하게 고려해야합니다.

+0

고마워요! 나는'Reduce'가 이것을 할 수 있다는 것을 알지 못했습니다. 나는 원래 데이터 인 data.frames의 목록을 다시 작성하는 데 약간의 어려움을 겪고있다. 원래 샘플 데이터가 모든 data.frames (df [1]]이 모든 열을 반환하고 df [[1]] [, 3]이 열 C를 검색하기 위해 사용 된 것이면 위의 코드를 어떻게 구현할 수 있습니까? ? – Nikitau

+0

'lapply' 안의리스트 전체에 걸쳐 모든 것을 매핑 할 수 있습니다. 또는 data.frame이 모두 비슷하다면, 그것들이 나온 요소에 대한 ID 열을 가진 하나의 큰 data.frame으로 바인딩하십시오 ('dplyr :: bind_rows'와'.id' 매개 변수 세트를 사용하면이 작업이 쉽습니다). 리스트 작업을위한 많은 유틸리티가있는'purrr '을 볼 수도있다. – alistaire