2016-12-24 1 views
2

현재 사회 남성 코끼리의 충돌 후 행동과 관련된 연구에 종사하고 있습니다. 나는 약간의 데이터 추출과 처리 속도를 대폭적으로 향상시키고 자 노력 중이다. 내 데이터 형식은 다음과 같습니다R : 복잡한 if-statements/for-loops를 작성하여 코끼리 행동을 추출하고 표를 작성하는 데 도움이됩니다.

Time = c(100, 120, 140, 440, 520, 650, 750) #time is in seconds 
Individual1 = c("Luke", "Luke", "Tyler", "Tyler", "Tyler", "Tyler", "Luke") 
Action = c("Over shoulder", "Displacement", "Trunk", "Trunk to mouth", "Tail swing", "Ears held out", "Trunk") 
Individual2 = c("Tyler", "Tyler", "own mouth", "Luke", "Tyler", "Tyler", "own mouth") 

df = data.frame(Time, Individual1, Action, Individual2) 

나는 충돌이 다음 10 분 창에서 침략의 피해자의 행동 데이터를 표로에 관심이 있어요. 이 경우 공격적인 행동은 "변위", 즉 눅 - 변위 - 타일러입니다.

나는 다음과 같은 작업을 세트 할 싶습니다, 나는 수를 앞으로 600초 (10 분) 원하는 모든 집계 (이 경우 120S에) 두 사람 사이의 변위의 시간에서 을 (해당 경우 Tyler)에서 10 분간의 창의 끝까지, 그리고 그 행동들이 (Individual2 열에있는 것이 무엇이든) 지시 될 때까지 Individual2에 의해 수행 된 행동. 대부분의 사건은 개인과 많은 변위 사이의 수백 가지 상호 작용으로 구성됩니다.

이 기능은 "적용"관련 기능입니까? 조건부 하위 집합 명령과 결합 된 "테이블"호출을 포함하는 for-loop?

업데이트 : 내가 필요 dataframes의 목록을 달성하기 위해 명령과 기능의 일련의 금형 관리했습니다 아래에 마이 아사 우라 (Maiasaura)의 지침에

감사합니다. 그러나 mutate()와 ifelse() 문을 결합한이 마지막 부분에서 문제가 있습니다. 최종 목표는 아래 함수로 생성 된 충돌 후 상호 작용을 살펴보고 데이터 프레임의 "액션"열에 아래의 제휴 행동이 포함되어 있는지 확인하는 것입니다.

library(dplyr) 
library(purrr) 

hostility <- c("Displacement", "Head shake", "Open mouth", "Head held up", 
"Trunk throw", "Chase", "Charge", "Head thrust", "Ear Fold", "Stand off", 
"Lunge", "Aggressive ear flap", "Ears held out") 

pos <- which(event$Action %in% hostility) 

grab_data <- function(pos) { 
    i2 <- as.character(event[pos, ]$Individual2) 
    i1 <- as.character(event[pos, ]$Individual1) 
    action <- as.character(event[pos, ]$Action) 
    start <- event[pos, ]$Time 
    df2 <- event %>% 
    dplyr::filter(Time > start) %>% 
    dplyr::filter(Time <= (start + 600)) %>% 
    dplyr::filter((Individual1 == i2 & Individual2 == i1) | (Individual1 == i1 & 
    Individual2 == i2)) %>% 
    mutate(Displaced = i2, OriginalDisplacer = i1, OriginalConflict = start, 
     Aggression = action, PCAff = ifelse(action %in% affiliation), "1","NA") 
    df2 
} 

df2 <- map(pos, grab_data) 

내가 기능을 적용 할 때, 그러나, 나는 다음과 같은 경고 얻을 :

오류 : 인수가 "아니오"입니다 여기

affiliation <- c("Trunk to body", "Other body","Head to head", "Trunk to mouth","Rubs", "Gentle sparing", "Trunk to head", "Head to body", "Trunk temperal", "Ear on face","Tail to body", "Trunk wrap", "Ear on rear", "greeting") 

는 마이 아사 우라 (Maiasaura)의 코드에서 편집하는 기능입니다 누락, 기본값 없음

이것은 마지막 mutate() 명령에 중첩 된 ifelse 문과 관련이 있습니다. 내가 여기서 무엇을 놓치고 있니? 조건이 충족되지 않으면 ifelse에 추가 인수를 제공해야합니까? 모든 R 지혜에 미리 감사드립니다!

+0

어떤 종류의 출력물을 찾고 있습니까? 'df'에 이벤트와 관련된 테이블 목록? 또는 다른 데이터 프레임? – sirallen

+0

아래 Maiasaura가 제공 한 코드에서 파생 된 출력은 유용한 테이블 목록을 생성합니다. 목록에있는 각 테이블과 연결된 Displacement가 무엇인지 알고 싶습니다. 즉, dplyr의 Mutate()를 사용하여 각 테이블에 대한 관련 Displacement의 타임 스탬프를 나열하는 추가 열을 추가합니다. –

+0

Mutate()를 사용하여 열을 쉽게 추가 할 수있었습니다. –

답변

2
# Install both packages with install.packages() if you don't have them. 
library(dplyr) 
library(purrr) 

hostility <- c("Displacement") # add other actions as necessary 

# Now we grab the positions where such hostile events occur 
# In your example this is only position 2 
pos <- which(df$Action %in% hostility) 

# This function will take a position, 
# then look 600 seconds forward for 
# rows for actions by Individual2 

grab_data <- function(pos) { 
    i2 <- as.character(df[pos, ]$Individual2) 
    start <- df[pos, ]$Time 
    df2 <- df %>% 
    dplyr::filter(Time <= (start + 600)) %>% 
    dplyr::filter(Individual1 == i2) %>% 
    mutate(actor = i2) 
    df2 
} 

# Now we can "apply" this list of positions to the function. This applies the 
# argument on the left (the positions) to the function and returns the output as 
# data.frames 
map(pos, grab_data) 
+0

Brilliant - 내가 생각한 바로는 @ 마이아사 우라라고 생각합니다! –

관련 문제