Записать именованный список строк с переменной длиной и количеством строк в текстовый файл на R - PullRequest
1 голос
/ 29 июня 2011

Я относительно новый пользователь R и все еще изучаю основы.

У меня есть именованный список xx эти записи выглядят так:

> xx[100:105]
$`15LOX-1`
[1] "207328_at"

$`16.1`
[1] "215946_x_at"

$`16.2`
[1] NA

$`16.3A5`
[1] "200983_x_at" "200984_s_at" "200985_s_at" "212463_at"   "228748_at"  

$`160-KD`
[1] "201224_s_at" "201225_s_at"

$`1600019D15Rik`
[1] "218465_at"   "222642_s_at" "225492_at"   "235907_at"   "238831_at"  

Я хотел бы сохранить его в текстовом файле с двумя столбцами - Key и Value. Если нескольким строкам соответствует один и тот же ключ, они должны находиться в разных строках. Символы двойных кавычек не обязательны.

Кроме того, как я могу избежать сохранения значений NA?

Пожалуйста, помогите.

Ответы [ 4 ]

4 голосов
/ 29 июня 2011
Пакет

reshape2 может сделать это с функцией плавления. Использование данных от Андри:

require(reshape2)
 > melt(x)
  value L1
1    a1  A
2    b1  B
3  <NA>  C
4    d1  D
5    d2  D
6    d3  D
7    d4  D
8    d5  D

Несколько вещей здесь не совсем такие, как вы хотите. Во-первых, столбцы расположены в обратном порядке, что может быть или не быть проблемой. Во-вторых, имена, связанные со столбцами, не совсем такие, как вы хотели, опять же, возможно, это не проблема. В-третьих, значение NA все еще присутствует, что является проблемой, основанной на вашем вопросе. Я бы использовал complete.cases() для решения этой проблемы и дал бы ей подходящие имена. Может быть, что-то вроде этого:

out <- melt(x)[, 2:1] #Reverse the key - value columns
out <- out[complete.cases(out) ,] #Subset only complete cases
names(out) <- c("Key", "Value")  #New column names

> out
  Key Value
1   A    a1
2   B    b1
4   D    d1
.....
4 голосов
/ 29 июня 2011

Воссоздать тестовые данные:

xx <- structure(list(
    `15LOX-1` = "207328_at", 
    `16.1` = "215946_x_at", 
    `16.2` = NA, 
    `16.3A5` = c("200983_x_at", "200984_s_at", "200985_s_at", "212463_at", "228748_at"), 
    `160-KD` = c("201224_s_at", "201225_s_at" ), 
    `1600019D15Rik` = c("218465_at", "222642_s_at", "225492_at", "235907_at", "238831_at")),
   .Names = c("15LOX-1", "16.1", "16.2", "16.3A5", "160-KD", "1600019D15Rik"))

Сначала удалите все значения NA:

xx[is.na(xx)] <- NULL

Теперь создайте временную переменную, которая хранит длину каждого элемента в x:

tmp <- sapply(xx, function(xt)length(xt))

Теперь используйте rep для создания ключа (то есть повторите имена x, каждый раз, когда длина соответствующего элемента), и используйте комбинацию unlist и unname для создания значений:

data.frame(
    key = rep(names(tmp), times=unname(tmp)),
    value = unlist(unname(xx))
)

Это производит:

             key       value
1        15LOX-1   207328_at
2           16.1 215946_x_at
3         16.3A5 200983_x_at
4         16.3A5 200984_s_at
5         16.3A5 200985_s_at
6         16.3A5   212463_at
7         16.3A5   228748_at
8         160-KD 201224_s_at
9         160-KD 201225_s_at
10 1600019D15Rik   218465_at
11 1600019D15Rik 222642_s_at
12 1600019D15Rik   225492_at
13 1600019D15Rik   235907_at
14 1600019D15Rik   238831_at

Наконец, используйте write.csv(x, file=...) или вашу любимую функцию записи, чтобы сохранить данные в файл.

3 голосов
/ 29 июня 2011

Используя тестовые данные Андри, вот своего рода ловкий способ сделать это, используя пакет reshape (или `reshape2 '):

x <- list(
    A = "a1",
    B = "b1",
    C = NA,
    D = paste("d", 1:5, sep=""))

Далее, melt имеет метод списка!

> melt(x)
  value L1
1    a1  A
2    b1  B
3  <NA>  C
4    d1  D
5    d2  D
6    d3  D
7    d4  D
8    d5  D

Затем мы можем извлечь NA s, используя complete.cases или что-то эквивалентное:

rs <- melt(x)
rs <- rs[complete.cases(x),]
colnames(rs) <- c('value','key')
2 голосов
/ 29 июня 2011

Я бы сделал что-то подобное.

#Create a matrix
z <- cbind(key=rep(names(xx), sapply(xx, length)), value = unlist(xx))
#Remove NA
z <- z[!is.na(z[,2]),]
#Write to textfile
write.table(z, "filename.txt", row.names= F)

Вы можете обратиться к помощи write.table, чтобы увидеть другие доступные опции.

Вот результат, заданный Андри

>z
                key             value        
15LOX-1        "15LOX-1"       "207328_at"  
16.1           "16.1"          "215946_x_at"
16.3A51        "16.3A5"        "200983_x_at"
16.3A52        "16.3A5"        "200984_s_at"
16.3A53        "16.3A5"        "200985_s_at"
16.3A54        "16.3A5"        "212463_at"  
16.3A55        "16.3A5"        "228748_at"  
160-KD1        "160-KD"        "201224_s_at"
160-KD2        "160-KD"        "201225_s_at"
1600019D15Rik1 "1600019D15Rik" "218465_at"  
1600019D15Rik2 "1600019D15Rik" "222642_s_at"
1600019D15Rik3 "1600019D15Rik" "225492_at"  
1600019D15Rik4 "1600019D15Rik" "235907_at"  
1600019D15Rik5 "1600019D15Rik" "238831_at"  

НТН

...