2016-05-31 9 views
-3

"id"로 그룹화하고 마지막 네 열 (그룹별로)에 몇 가지 산술 기능을 적용하고 해당 행을 포함하는 df에 새 행을 추가하려면 어떻게합니까? 결과.R 행의 결과를 df로 그룹화하여 이름별로 여러 열을 그룹으로 계산합니다.

d1 d2 id type   treat v1_gm v2_pct v3_pct 
1 info info 1 leaf   NA  0.2 70  90 
2 info info 1 flower  A  0.5 80  80 
3 info info 2 leaf   NA  0.4 65  80 
4 info info 2 flower  A  0.1 90  90 
5 info info 3 leaf   NA  0.6 55  80 
6 info info 3 stem   A  0.3 80  30 
7 info info 4 leaf   NA  0.6 30  40 
8 info info 4 flower  A  0.7 75  75 
9 info info 5 leaf/stem NA  0.8 80  75 

재현 예 :

df <- data.frame(matrix(NA, nrow = 9, ncol = 8), row.names=NULL) 
colnames(df) <- c("d1","d2","id","type","treat","v1_gm","v2_pct","v3_pct") 
df$d1 <- "info" 
df$d2 <- "info" 
id <- c(1,1,2,2,3,3,4,4,5) 
df$id <- c(1,1,2,2,3,3,4,4,5) 
df$type <- c("leaf","flower","leaf","flower","leaf","stem","leaf","flower","leaf/stem") 
df$treat <- c(NA,"A",NA,"A",NA,"A",NA,"A",NA) 
df$v1_gm <- c(0.2,0.5,0.4,0.1,0.6,0.3,0.6,0.7,0.8) 
df$v2_pct <- c(70,80,65,90,55,80,30,75,80) 
df$v3_pct <- c(90,80,80,90,80,30,40,75,75) 

결과 테이블은 다음과 같이 표시한다 (5 개) 여기에서 샘플 (ID) 및 (8) 열이 예시적인 예이다. 행 3, 6, 9 및 13은 결과가 포함 된 새 행입니다. 새로운 행은 테이블의 끝에 추가 할 수도 있고 나중에 rbind를 사용하여 추가 할 tmp df에 넣을 수도 있습니다 (어느 쪽이든하는 방법을 알 수는 없습니다). 그룹화 var는 열 "id"입니다. 함수 합계는 "v1_gm"에 사용됩니다. '평균'기능은 여러 개의 연속 열에 사용되며 여기에서 'v1_pct'및 'v3_pct'는 이름으로 호출해야합니다 (예 : v1_pct : v3_pct). 새 행의 "type"값은 그룹 행의 "type"에서 연결되며 "d1"및 "d2"는 treat == "A"인 그룹 행에서 복사되고 새 행의 "treat" 행에 값 "cmb"가 지정됩니다.

d1 d2 id type   treat v1_gm v2_pct v3_pct 
1 info info 1 leaf   NA 0.2 70  90 
2 info info 1 flower  A  0.5 80  80 
3 info info 1 leaf/flower cmb 0.7 75  85 
4 info info 2 leaf   NA 0.4 65  80 
5 info info 2 flower  A  0.1 90  90 
6 info info 2 leaf/flower cmb 0.5 77.5 85 
7 info info 3 leaf   NA 0.6 55  80 
8 info info 3 stem   A  0.3 80  30 
9 info info 3 leaf/stem cmb 0.9 67.5 55 
10 info info 4 leaf   NA 0.6 30  40 
11 info info 4 flower  A  0.7 75  75 
13 info info 4 leaf/flower cmb 1.3 52.5 57.5 
14 info info 5 leaf/stem NA 0.8 80  75 

답변

0

를 얻을 수 있습니다 bind_rows 다음 사용합니다, 다음 스크립트 완전히 문제를 해결합니다.

library("dplyr") 
res1 <- df %>% 
    group_by(id) %>% 
    mutate( 
    v1_gm = sum(v1_gm), 
    v2_pct = mean(v2_pct), 
    v3_pct = mean(v3_pct), 
    type = paste(type,collapse="/")) %>% 
    filter(treat == "A") %>% 
    mutate(treat = as.character("calculated")) 
final_res1 <- bind_rows(df,res1) 
final_res1$id <- as.character(final_res1$id) 
final_res1 <- final_res1 [order(final_res1$id, final_res1$treat, na.last=FALSE), ] 
1

그룹 요약을 데이터 프레임에 행으로 추가 할 수 있는지 확신 할 수 없습니다. 당신은 그것을 열로 할 수 있어야합니다.

library("dplyr") 
res1 <- df %>% group_by(id) %>% mutate(sumV1 = sum(v1_gm),meanV2 = mean(v2_pct),meanV3 = mean(v3_pct),gr_type = paste(type,collapse="/")) %>% filter(treat == "A") %>% select(d1,d2,id,type,v1_gm=sumV1, v2_pct = meanV2, v3_pct = meanV3,type = gr_type) 

이 당신에게 답을주고 당신이 원하는 결과 @Arun의 대답의 일부 수정과 함께

final_res <- bind_rows(df,res1) 
+0

연결할은 str_c에서 (유형 9 월은 = "/") 작동하지 않는 것,하지만 그랬다면 나는 한 번 파일에 결과를 보내! = "A 치료의 모든 행을 삭제할 수 있습니다 ", 계산 된 열 이름을 원래 col 이름으로 바꾼 후 tmp를 원래 파일로 rbind하십시오. –

+0

죄송합니다. 대신 붙여 넣기 명령을 사용할 수 있습니다. 답변을 변경했습니다. 그런 다음 pipe 명령을 사용하여 필터링 할 수 있습니다. – theArun

+0

실제로, 실제 데이터 테이블에는 v3_pct 이후와 유사한 추가 25 개의 열이 있습니다.이 중 모두는 v2_pct 및 v3_pct와 동일한 방식으로 처리해야합니다 (즉, 그룹). 마지막 열이 v25 인 경우 v1_pct : v25를 선택하여 계산을 위해 개별적으로 입력하지 않도록 코드를 일반화하는 방법이 있습니까? –

관련 문제