2017-04-20 10 views
6

각 관찰 ID는 일반적으로 X : Y 형식의 시퀀스로 저장된 숫자이며 때로는 연결된 목록입니다. 데이터를 정리하여 각 관찰에 고유 한 행이 있으므로 조인 기능을 사용하여 더 자세한 설명이있는 ID를 추가 할 수 있습니다. 일반적으로 tidyr에서 gather() 함수를 사용하면되지만이 문자는 그대로 ID 풀기에 문제가 있습니다. 그러나콜론 및 연결된 벡터로 정의 된 시퀀스 문자열을 기반으로 긴 데이터 형식을 만듭니다.

example <- data_frame(x = LETTERS[1:3], y = c("Condition 1", "Condition 2", "Condition 3"), z = c("1:3", "4:6", "c(7,9,10)")) 

example 
# A tibble: 3 × 3 
     x   y   z 
    <chr>  <chr>  <chr> 
1  A Condition 1  1:3 
2  B Condition 2  4:6 
3  C Condition 3 c(7,9,10) 

이 작동하지 않고 모든 NA을 생산 :

이 데이터는 다음과 같습니다

as.numeric("1:3") 
as.integer("1:3") 
as.numeric("c(7,9,10)") 
as.integer("c(7,9,10)") 

이 작업을 수행 할 수있는 간단한 방법이 있어야하지만 하나의 긴 방법 거라고 생각 먼저 번호를 추출하여 목록으로 저장하십시오. 는 X를 들면 다음과 같습니다과 같이 다른 하나 개의 숫자에서 시퀀스를 생성하는 다음과 : "": Y ID는 난에 문자열을 spliting하여이 작업을 수행 할 수

example[1:2,] %>% 
+ separate(z, c("a", "b"), sep = ":") %>% 
+ mutate(a = as.numeric(a), b = as.numeric(b), new = list(seq(a, b))) 
Error in eval(expr, envir, enclos) : 'from' must be of length 1 

그러나이 작동하지 않았다.

이 같은 모습을 목표로하고있어 무엇 :

# A tibble: 9 × 3 
     x   y  z 
    <chr>  <chr> <dbl> 
1  A Condition 1  1 
2  A Condition 1  2 
3  A Condition 1  3 
4  B Condition 2  4 
5  B Condition 2  5 
6  B Condition 2  6 
7  C Condition 3  7 
8  C Condition 3  9 
9  C Condition 3 10 

그것을 달성하는 가장 간단한 방법은 무엇입니까? 당신이 언어를 확장하지 않는 한

+0

을 사용할 수 있습니다, 그것은 문자열로 코드를 저장하는 나쁜 생각입니다. 관측 당 하나 이상의 값을 저장해야하는 경우 목록 열을 사용하십시오. – alistaire

+0

동의합니다. 이 데이터 형식은 타사의 생물 정보학 패키지에서 제공됩니다. 나는 그들의 github repo에 대한 제안을 할 수 있습니다. –

답변

11

우리는 tidyverse

library(tidyverse) 
example %>% 
    group_by(x) %>% 
    mutate(z = list(eval(parse(text=z)))) %>% 
    unnest 
#  x   y  z 
# <chr>  <chr> <dbl> 
#1  A Condition 1  1 
#2  A Condition 1  2 
#3  A Condition 1  3 
#4  B Condition 2  4 
#5  B Condition 2  5 
#6  B Condition 2  6 
#7  C Condition 3  7 
#8  C Condition 3  9 
#9  C Condition 3 10