我是相对较新的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值?
请帮忙。
答案 0 :(得分:4)
重新创建测试数据:
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=...)
或您喜欢的写入功能将数据保存到文件中。
答案 1 :(得分:4)
reshape2
包可以使用融合功能执行此操作。使用Andrie的数据:
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
.....
答案 2 :(得分:3)
使用Andrie的测试数据,这是使用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
或等效的内容提取complete.cases
:
rs <- melt(x)
rs <- rs[complete.cases(x),]
colnames(rs) <- c('value','key')
答案 3 :(得分:2)
我会做这样的事情。
#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的帮助以查看其他可用选项。
以下是Andrie提出的结果
>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"
HTH