2017-02-21 2 views
0

데이터 프레임에서 그룹의 한 열에 리드/래그를 적용하려고합니다. 리드 값을 제공하는 별도의 데이터 프레임이 있습니다. 리드 값은 주체, 노드 및 센서간에 일치해야합니다.dplyr 각 그룹에 리드/래그를 적용하십시오.

데이터 예 :

dput(test_df) 
structure(list(subj = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L), class = "factor", .Label = c("c1", "c2")), node = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Node 1", "Node 2"), class = "factor"), 
    sensor = c(2600, 2600, 2600, 2600, 2600, 2610, 2610, 2610, 
    2610, 2610, 2620, 2620, 2620, 2620, 2620, 2630, 2630, 2630, 
    2630, 2630, 2600, 2600, 2600, 2600, 2600, 2610, 2610, 2610, 
    2610, 2610, 2620, 2620, 2620, 2620, 2620, 2630, 2630, 2630, 
    2630, 2630), env_vals = c(5.33510151261835, 5.37708998203619, 
    5.18984848232565, 6.82992070825272, 5.92982096601743, 7.05707692156306, 
    7.67415658214675, 7.34534719192697, 6.5280531083936, 4.42063211468128, 
    4.98606873099945, 6.71683566611408, 7.04201828330796, 3.22384043747125, 
    7.16178630140025, 3.97134044753568, 3.06904118833596, 6.10839825474766, 
    2.51080443592448, 1.62815576579611, 4.5366549039861, 4.05204500710188, 
    8.50974398925943, 0.454711437225098, 7.63457277730028, 7.73074760170432, 
    1.7535421576035, 1.255666521349, 2.67319773682482, 1.61263970508914, 
    6.84515776718986, 4.319997054675, 5.64959416239443, 1.52348658940225, 
    4.05659367113441, 5.19205390068456, 2.41995034428535, 4.81929265375379, 
    4.65957617474215, 3.85295676615691)), .Names = c("subj", 
"node", "sensor", "env_vals"), row.names = c(NA, -40L), class = "data.frame") 

dput(cc_df) 
structure(list(subj = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("c1", "c2"), class = "factor"), 
    node = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Node 1", "Node 2"), class = "factor"), 
    sensor = c(2600, 2610, 2620, 2630, 2600, 2610, 2620, 2630, 
    2600, 2610, 2620, 2630, 2600, 2610, 2620, 2630), lg_val = c(1, 
    1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4)), .Names = c("subj", 
"node", "sensor", "lg_val"), row.names = c(NA, -16L), class = "data.frame") 

가 cc_df에 따라 노드, 센서의 조합을 통해 반복하고 해당 리드/래그 값을 적용하여 이러한. 내가 (열 일치에 대한뿐만 아니라 일부 관련이없는 열)/다시 지연 리드를 얻을 위에 나는 t2 부분의 주석을 해제하면

for(i in 1:nrow(cc_df)){ 
    sbj <- as.character(cc_df[i,1]) 
    nd <- as.character(cc_df[i,2]) 
    sens <- cc_df[i,3] 
    lg_val <- as.numeric(cc_df[i,4]) 
    # print(str(data.frame(sbj,nd,sens,lg_val))) 

    # t2 <- filter(test_df, subj==sbj, node==nd, sensor==sens) %>% transmute_(lagged_env_sensor=lead(env_vals,lg_val)) 

    test_df <- group_by(test_df, subj==sbj, node==nd, sensor==sens) %>% mutate(lagged_env_sensor=lead(env_vals,lg_val)) 
} 

이 나에게 Error in eval(expr, envir, enclos) : cannot modify grouping variable

을 제공합니다.

그럼 내 질문은 올바른 리드/래그 값을 test_df의 올바른 그룹에 어떻게 적용 할 수 있습니까?

감사합니다.

이안

+2

예상되는 출력은 무엇입니까? 이것은 단지 병합이 아닌가? – Sotos

답변

0

당신이 join 작업을 수행하고 싶습니다처럼 소리 : 이제

library(dplyr) 
new_df <- left_join(test_df, cc_df, by=c("subj", "node", "sensor")) 

당신이있어 모두 env_vals과 같은 테이블에 lg_val, 주제, 노드에 의해 할당 및 센서 :

str(new_df) 
# 'data.frame': 80 obs. of 5 variables: 
# $ subj : Factor w/ 2 levels "c1","c2": 1 1 1 1 1 1 1 1 1 1 ... 
# $ node : Factor w/ 2 levels "Node 1","Node 2": 1 1 1 1 1 1 1 1 1 1 ... 
# $ sensor : num 2600 2600 2600 2600 2600 2600 2600 2600 2600 2600 ... 
# $ env_vals: num 5.34 5.34 5.38 5.38 5.19 ... 
# $ lg_val : num 1 3 1 3 1 3 1 3 1 3 ... 

이제는 새로운 열을 만들 수 있습니다 (현재는 오류가 발생 함) :

mutate(new_df, lagged_env_sensor=lead(env_vals, lg_val)) 
관련 문제