2017-04-08 2 views
2

2 개의 개별 키 그룹을 두 개의 키 - 값 쌍으로 수집하려고합니다.gather()를 사용하여 2 개 이상의 키 - 값 쌍으로 두 개 이상의 그룹을 모으는 중

library(dplyr) 
library(tidyr) 
ID = c(1:5) 
measure1 = c(1:5) 
measure2 = c(6:10) 
letter1 = c("a", "b", "c", "d", "e") 
letter2 = c("f", "g", "h", "i", "j") 

df = data.frame(ID, measure1, measure2, letter1, letter2) 
df = tbl_df(df) 
df$letter1 <- as.character(df$letter1) 
df$letter2 <- as.character(df$letter2) 

I 두 계수 열 (measure1 및 measure2)의 값이 옆 키 컬럼 (키 - 값 쌍)가 한 열에 판정 할 다음은 일부 예시적인 데이터이다. 나는 또한 letter1과 letter2에 대해서도 같은 것을 원한다. 그래서 (이 경우) 완벽하게 작동,하지만 난이 추측

df_measure = df %>% 
    select(ID, measure1, measure2) %>% 
    gather(measure_time, measure, -ID) %>% 
    mutate(id.extra = c(1:10)) 
df_letter = df %>% 
    select(ID, letter1, letter2) %>% 
    gather(letter_time, letter, -ID) %>% 
    mutate(id.extra = c(1:10)) 
df_long = df_measure %>% 
    left_join(df_letter, by = "id.extra") 

을 : 나는 (이 일을)에 가입 한 후, 선택() 두 개의 서로 다른 데이터 세트를 만드는 데 사용하는 두 데이터 세트에 별도로 수집 사용할 수 있다고 생각 (id.extra를 쪼개거나 만들지 않고)보다 우아하게 할 수 있습니다.

답변

3

다음과 같이 사용할 수 있습니다. 중복 된 정보가 많이 포함되어있는 것처럼 보이기 때문에 현재의 접근 방식이 정확히 원하는 출력인지 확실하지 않습니다.

df %>% 
    gather(val, var, -ID) %>% 
    extract(val, c("value", "time"), regex = "([a-z]+)([0-9]+)") %>% 
    spread(value, var) 
# # A tibble: 10 × 4 
#  ID time letter measure 
# * <int> <chr> <chr> <chr> 
# 1  1  1  a  1 
# 2  1  2  f  6 
# 3  2  1  b  2 
# 4  2  2  g  7 
# 5  3  1  c  3 
# 6  3  2  h  8 
# 7  4  1  d  4 
# 8  4  2  i  9 
# 9  5  1  e  5 
# 10  5  2  j  10 

이것은 훨씬 더 쉽게 "data.table"에서 melt + patterns로 수행됩니다

library(data.table) 
melt(as.data.table(df), measure.vars = patterns("measure", "letter")) 

아니면 구식하고 단지베이스에서 reshape을 사용할 수 있습니다 R. 그러나 기본 R의 reshape은 "tibbles"를 좋아하지 않으므로 as.data.frame으로 변환해야합니다.

reshape(as.data.frame(df), direction = "long", idvar = "ID", 
     varying = 2:ncol(df), sep = "") 
+0

이 (가)() 함수는이 작업을 수행 할 수 없습니다 모여 여러 걸릴 수 data.table에서 melt를 사용할 수 있습니까? –

+1

@BenjaminTelkamp, ​​무엇을 할 수 없습니까? 나는 첫 번째 접근에서'gather' 함수를 사용했다. 그러나, 모든 기둥들을 모아서 펼쳐야합니다. – A5C1D2H2I1M1N2O1R2T1

1

우리는 measurepatterns

library(data.table) 
melt(setDT(df), measure = patterns("^measure", "^letter"), 
      value.name = c("measure", "letter")) 
#  ID variable measure letter 
# 1: 1  1  1  a 
# 2: 2  1  2  b 
# 3: 3  1  3  c 
# 4: 4  1  4  d 
# 5: 5  1  5  e 
# 6: 1  2  6  f 
# 7: 2  2  7  g 
# 8: 3  2  8  h 
# 9: 4  2  9  i 
#10: 5  2  10  j 
+0

이 코드는 훌륭하게 보이지만 코드에서 columnn 또는 변수 이름을 명시 적으로 사용하려면 어떻게해야합니까? 또한 두 개의 키 - 값 쌍으로 끝내고 싶습니다. –

+1

@ BenjaminTelkamp, ​​그냥 "변수"열을 복제 .... 왜 당신은 중복 된 데이터를 원할 것입니까? – A5C1D2H2I1M1N2O1R2T1

+0

이 경우 측정 및 편지에 대한 두 가지 관찰이 있지만 한 그룹에 대해 세 번의 관찰이 있다면 어떻게 될까요? –