2017-04-20 59 views
6

Her gözlemin kimliklerinin genellikle X: Y biçiminde, ancak bazen birleştirilmiş listeler halinde diziler halinde depolandığı sayılardır. Verileri düzenli hale getirmek istiyorum ki her gözlem kendi satırına sahip olacak, böylece daha açıklayıcı kimlikler eklemek için bir katılma işlevi kullanabileceğim. Normalde tidyr numaralı telefondan gather() işlevini kullanırdım, ancak kimlikleri karakterleri olduğu gibi açma konusunda sorun yaşıyorum. AncakCololar ve birleştirilmiş vektörler tarafından tanımlanan dizilerin dizilerine göre uzun veri formatı yaratın

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) 

bunlar işe yaramazsa ve tüm NA üretmek:

veri şuna benzer

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

Bunu yapmak için basit bir yolu olmalı ama bir uzun yol düşünmüştüm ki sayıları ayıklamak ve önce bir liste olarak saklamak. X için: böylece gibi diğer bir numaradan bir diziyi oluştururken sonra ve: "": Y kimlikleri ben de dize çatlıyor bu yapabileceğini

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 

Ancak bu işe yaramadı.

böyle görünüşleri için amaçlayan ediyorum Ne:

# 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 

bunu başaracak en basit yolu nedir? Eğer dil uzanan sürece

+0

kullanabilirsiniz, o dizeleri olarak kod depolamak için kötü bir fikirdir. Her gözlem için birden fazla değer kaydetmeniz gerekiyorsa, bir liste sütunu kullanın. – alistaire

+0

Katılıyorum. Bu veri formatı 3. taraf biyoenformatik paketinden geliyor. Github repo'larında bir öneride bulunabilirim. –

cevap

11

Biz 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