2017-11-10 2 views
1

I는 다음과 같은 데이터를 가지고
= ID, Trim_SSW = 임신 삼 (1, 2 또는 3), 중량 = 피사체 PseudoID을 시점 SSW에서 무게와 SSW = 임신 주 각 ID에 대한 감산 주제별 그룹화 된 데이터 범주 형 변수에 따른

structure(list(PseudoID = c(1001L, 1001L, 1001L, 1001L, 1001L, 
1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L), Trim_SSW = c("T1", 
"T1", "T2", "T2", "T2", "T3", "T3", "T3", "T3", "T3", "T3", "T3", 
"T3", "T1", "T1", "T1", "T2", "T2", "T2", "T3"), weight = c(120.8, 
120.9, 120.8, 122.2, 122.5, 125, 124.6, 126.6, 126.4, 126.7, 
126.7, 128, 129.3, 101.7, 100.5, 100.2, 101.7, 104.2, 104.2, 
105.6), SSW = c(8L, 12L, 15L, 19L, 23L, 27L, 30L, 33L, 35L, 36L, 
37L, 38L, 39L, 9L, 10L, 13L, 18L, 22L, 25L, 29L)), .Names = c("PseudoID", 
"Trim_SSW", "weight", "SSW"), row.names = c(4L, 5L, 15L, 12L, 
17L, 16L, 11L, 6L, 3L, 1L, 2L, 18L, 20L, 46L, 47L, 49L, 42L, 
43L, 48L, 31L), class = "data.frame") 

, 나는 각각의 임신에서 체중 증가를보고 싶어요. 따라서 T1, T2 및 T3의 마지막 측정과 첫 번째 측정의 차이점을 별도로 찾아야합니다. 한 학기 만 1 측정 만 가능할 경우 NA를 입력하고 싶습니다. 3 개의 새로운 변수 (T1gain, T2gain, T3gain)를 사용하면 더 많은 계산을 쉽게 할 수 있다고 가정합니다.

나는 비슷한 게시물을 보았지만 완전히 질문에 답하지 못했고 새로운 게시물을 작성하도록 요청 받았습니다.

+0

명확하지 변수의 클래스 유형을 변경해야합니다. 신분증, 임신기, T1gain, T2gain, T3gain과 같은 새로운 데이터 프레임입니까? 또는 원본 데이터 프레임에 이득 정보를 추가 하시겠습니까? – AntoniosK

+0

@AntoniosK 예, ID, 트리 스테 에스테르, T1gain, T2gain, T3gain 열이있는 새로운 데이터 프레임 –

답변

0
library(dplyr) 
library(tidyr) 

structure(list(PseudoID = c(1001L, 1001L, 1001L, 1001L, 1001L, 
1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1001L, 1002L, 
1002L, 1002L, 1002L, 1002L, 1002L, 1002L), Trim_SSW = c("T1", 
"T1", "T2", "T2", "T2", "T3", "T3", "T3", "T3", "T3", "T3", "T3", 
"T3", "T1", "T1", "T1", "T2", "T2", "T2", "T3"), weight = c(120.8, 
120.9, 120.8, 122.2, 122.5, 125, 124.6, 126.6, 126.4, 126.7, 
126.7, 128, 129.3, 101.7, 100.5, 100.2, 101.7, 104.2, 104.2, 
105.6), SSW = c(8L, 12L, 15L, 19L, 23L, 27L, 30L, 33L, 35L, 36L, 
37L, 38L, 39L, 9L, 10L, 13L, 18L, 22L, 25L, 29L)), .Names = c("PseudoID", 
"Trim_SSW", "weight", "SSW"), row.names = c(4L, 5L, 15L, 12L, 
17L, 16L, 11L, 6L, 3L, 1L, 2L, 18L, 20L, 46L, 47L, 49L, 42L, 
43L, 48L, 31L), class = "data.frame") -> dt 

dt %>% 
    group_by(PseudoID, Trim_SSW) %>%          # for each ID and trimester 
    summarise(Weight_gain = weight[length(weight)] - weight[1],   # get last - first weights 
      NumRows = n(),            # count number of rows/observations 
      Weight_gain = ifelse(NumRows == 1, NA, Weight_gain)) %>%  # flag with NA if there's only 1 row 
    select(-NumRows) %>%             # remove unecessary column 
    mutate(Trim_SSW = paste0(Trim_SSW, "_gain")) %>%      # change the names 
    ungroup() %>%               # forget the grouping 
    spread(Trim_SSW, Weight_gain)           # reshape 

# # A tibble: 2 x 4 
# PseudoID T1_gain T2_gain T3_gain 
# * <int> <dbl> <dbl> <dbl> 
# 1  1001  0.1  1.7  4.3 
# 2  1002 -1.5  2.5  NA 
1

나는 dplyrdata.table을 사용하고 있으며 둘 다 강력한 패키지입니다. 원하는 정확한 출력을 알 수 없으므로 bc의 두 출력을 비교하여 사용자의 요구에 맞는 출력을 확인할 수 있습니다. 당신이 b을 선호하는 경우 물론

# doing the calculations                                                                   17L, 16L, 11L, 6L, 3L, 1L, 2L, 18L, 20L, 46L, 47L, 49L, 42L, 
library(dplyr)                                                                  43L, 48L, 31L), class = "data.frame") 
b <- a %>% 
    group_by(PseudoID, Trim_SSW) %>% 
    summarize(gain = last(weight) - first(weight)) 

# reshaping data from long to wide format 
library(data.table) 
c <- setDT(b) 
c <- dcast(c, PseudoID ~ Trim_SSW, value.var = "gain") 

# rename column names 
names(c)[2:4] <- c("T1_gain", "T2_gain", "T3_gain") 


# comparing the two outputs 
> b 
# A tibble: 6 x 3 
# Groups: PseudoID [?] 
    PseudoID Trim_SSW gain 
    <int> <chr> <dbl> 
1  1001  T1 0.1 
2  1001  T2 1.7 
3  1001  T3 4.3 
4  1002  T1 -1.5 
5  1002  T2 2.5 
6  1002  T3 0.0 

> c 
    PseudoID T1_gain T2_gain T3_gain 
1:  1001  0.1  1.7  4.3 
2:  1002 -1.5  2.5  0.0 

, 그에 따라 출력이 어떻게해야 (순서대로 요소, 요소, 숫자)

관련 문제