2017-11-17 7 views
2

나는 며칠 동안 웹을 검색하고 있으며 (아마 해결하기 쉬운) 내 문제에 대한 해결책을 찾을 수 없다.조건이 충족되기 전과 후에 데이터 프레임의 행을 선택하는 방법은 무엇입니까?

나는 4 개의 변수가있는 거대한 데이터 프레임과 각각 백만 건 이상의 관찰을 가지고 있습니다. 이제 특정 조건이 충족 된 후 모든 행과 1000 행을 선택하고 나머지는 NA로 채 웁니다. for 루프와 if/ifelse로 시도했지만 지금까지는 작동하지 않습니다. 나는 그것이 큰 일이 아니어야한다고 생각하지만, 그 순간 나는 그걸 포기하지 않았다.

나는 사용하여 데이터를 생성 :

내 데이터는 다음과 같습니다
foo<-data.frame(t = 1:15, a = sample(1:15), b = c(1,1,1,1,1,4,4,4,4,1,1,1,1,1,1), c = sample(1:15)) 

:

ID t a b c 
1  1 4 1 7 
2  2 7 1 10 
3  3 10 1 6 
4  4 2 1 4 
5  5 13 1 9 
6  6 15 4 3 
7  7 8 4 15 
8  8 3 4 1 
9  9 9 4 2 
10 10 14 1 8 
11 11 5 1 11 
12 12 11 1 13 
13 13 12 1 5 
14 14 6 1 14 
15 15 1 1 12 

내가 원하는 것은 모든, 2 행하기 전에 (이 예에서는) a의 값을 선택하는 것입니다 b 값이 1보다 큰 행과 3 행을 포함하고 나머지는 NA로 채 웁니다. [이것은 단지 예일 뿐이므로이 15 개의 행 뒤에 b의 값이있는 행이 여러 번 있다고 상상할 수 있습니다. (게시하지 않았으므로 불필요한 질문을 스팸하지 않습니다. .

ID t a b c d 
1  1 4 1 7 NA 
2  2 7 1 10 NA 
3  3 10 1 6 NA 
4  4 2 1 4 2 
5  5 13 1 9 13 
6  6 15 4 3 15 
7  7 8 4 15 8 
8  8 3 4 1 3 
9  9 9 4 2 9 
10 10 14 1 8 14 
11 11 5 1 11 5 
12 12 11 1 13 11 
13 13 12 1 5 NA 
14 14 6 1 14 NA 
15 15 1 1 12 NA 

내가 어떤 도움을 감사 해요 : 데이터)] 그래서 내가 좋아하는 뭔가를 얻으려면.

감사합니다.

안부, 크리스 여기

+0

나는이 질문을 이해하지 못한다. 아마도'd' 열은 여러분의 "조건"에 기반을 두지 만,'d' 열은 첫 번째 항목과 마지막 항목을 제외하고'a' 열과 동일합니다. 그렇지 않습니까? 'b'는 여기서 어떻게 역할을합니까? 특정 사례의 상태를 명확하게 설명해 주시겠습니까? –

+0

죄송합니다. 제 첫 질문입니다.이 예제의 데이터를 가능한 한 많이 줄이려고 했으므로별로 적당하지 않은 것 같습니다. 내 데이터는 'b'가 (4)와 (1)을 켠다 LED이고, LED가 켜지 기 직전에 'a'의 값 10 개를 롤링 평균 (100 값)으로 계산하려는 실험에서 나온 것입니다. , LED가 꺼지면 켜지고 1000 값이됩니다. 50 만 회의 관측이있을 때마다 달라 보입니다. – Chris

+0

@missuse의 답이 귀하의 질문을 해결하지 못하는 경우, 귀하가 테스트 케이스의 조건 및 예상 결과를 진술 한 * 대표 및 최소 예 *를 제공해주십시오. 나는 그것이 SO 커뮤니티에 당신의 문제를 명확히하는 데 많은 도움이 될 것이라고 생각합니다. –

답변

1

는 시도이다.

dNA

foo$d <- NA 

가득 열 appr을 가진 요소를 교체를 만들 b > 1

z <- which(foo$b > 1) 

(z - 2) : (z + 3)

ind <- unique(unlist(lapply(z, function(x){ 
    g <- pmax(x - 2, 1) #if x - 2 is negative 
    g : (x + 3) 
}))) 

에 대한 인덱스를 얻을 조건을 만족하는 인덱스를 가져옵니다 여기 foo$a

foo$d[ind] <- foo$a[ind] 
+0

감사합니다. 나는 그것이 잘 작동해야한다고 생각합니다, 불행히도 지금까지는 실제 데이터에 있지 않습니다. 그러나 나는 그것을 해결할 것이다. 처음에는 '단지 0이 음의 첨자와 섞여있을 수 있습니다.'라는 오류가 있었고 데이터 프레임을 부분 집합하여 조금만 줄이면 교체 오류가 발생했지만 아직 이해할 수 없습니다. 그러나 당신의 해결책은 나에게 앞으로 몇 걸음 나아 간다! – Chris

+0

@Chris 데이터를 제공 할 수 있다면 솔루션을 제공하기 위해 50 만 줄을 다운로드해도 상관 없습니다. 지금 작동하는지 확인하십시오. 'lapply' 호출에 추가 조건을 추가했습니다. – missuse

+0

고맙습니다. @missuse! I – Chris

1

와 opriate 인덱스는 missuse 같은 시도하지만, data.table로 : 여기

library(data.table) 
foo<-data.frame(t = 1:11, a = sample(1:11), b = c(1,1,1,4,4,4,4,1,1,1,1), c = sample(1:11)) 
DT <- setDT(foo) 
DT[ unique(c(DT[,.I[b>1] ],DT[,.I[b>1]+3 ],DT[,.I[b>1]-2 ])), d := a] 

    t a b c d 
1: 1 10 1 2 NA 
2: 2 6 1 10 6 
3: 3 5 1 7 5 
4: 4 11 4 4 11 
5: 5 4 4 9 4 
6: 6 8 4 5 8 
7: 7 2 4 8 2 
8: 8 3 1 3 3 
9: 9 7 1 6 7 
10: 10 9 1 1 9 
11: 11 1 1 11 NA 

unique(c(DT[,.I[b>1] ],DT[,.I[b>1]+3 ],DT[,.I[b>1]-2 ])) 

는 원하는 indixes에게 제공합니다의 고유 인덱스 조건에 맞는 선, 같은 지수 + 3과 -2.

+0

답장을 보내 주셔서 감사합니다 슬프게도 범위를 벗어났다 고했는데 작동하지 않습니다 – Chris

+0

오타를 만들었습니다 올바르게 수정해야 작동합니다 – denis

0
library(dplyr) 
library(purrr) 

# example dataset 
foo<-data.frame(t = 1:15, 
       a = sample(1:15), 
       b = c(1,1,1,1,1,4,4,4,4,1,1,1,1,1,1), 
       c = sample(1:15)) 

# function to get indices of interest 
# for a given index x go 2 positions back and 3 forward 
# keep only positive indices 
GetIDsBeforeAfter = function(x) { 
    v = (x-2) : (x+3) 
    v[v > 0] 
} 


foo %>%      # from your dataset 
    filter(b > 1) %>%   # keep rows where b > 1 
    pull(t) %>%     # get the positions 
    map(GetIDsBeforeAfter) %>% # for each position apply the function 
    unlist() %>%     # unlist all sets indices 
    unique() -> ids_to_remain # keep unique ones and save them in a vector 

foo$d = foo$c     # copy column c as d 
foo$d[-ids_to_remain] = NA  # put NA to all positions not in our vector 

foo 

#  t a b c d 
# 1 1 5 1 8 NA 
# 2 2 6 1 14 NA 
# 3 3 4 1 10 NA 
# 4 4 1 1 7 7 
# 5 5 10 1 5 5 
# 6 6 8 4 9 9 
# 7 7 9 4 15 15 
# 8 8 3 4 6 6 
# 9 9 7 4 2 2 
# 10 10 12 1 3 3 
# 11 11 11 1 1 1 
# 12 12 15 1 4 4 
# 13 13 14 1 11 NA 
# 14 14 13 1 13 NA 
# 15 15 2 1 12 NA 
+0

감사합니다. 이하. – Chris

관련 문제