首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RR中集成2个列表和一个数据闹剧

在RR中集成2个列表和一个数据闹剧
EN

Stack Overflow用户
提问于 2017-06-06 01:42:45
回答 3查看 56关注 0票数 1

请您告知我可以使用的R代码,以便执行以下操作:

  1. 我有两个“基因组坐标”列表:一个列表是由代表基因组坐标的数字组成的;

让我们假设列表N

代码语言:javascript
复制
n1    
n2    
n3    
n4

还有一个列表M

代码语言:javascript
复制
m1     
m2     
m3     
m4     
m5
  1. 和一个数据C,其中对于上面列表中的一些坐标(n,m),我们有一个数值强度;

例如:

代码语言:javascript
复制
n1; m1; 100 
n1; m2; 300

问题是:我可以使用什么最有效的R代码来集成list N、list M和dataframe C,以便使用以下方法获得数据:

  • N作为列名列出
  • M作为行名列出
  • N * M单元格中的值,对应于数据帧C中的数值。

一个小小的例子是:

代码语言:javascript
复制
     n1  n2  n3 n4 
m1  100  -   -   - 
m2  300  -   -   - 
m3   -   -   -   - 
m4   -   -   -   - 
m5   -   -   -   -
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-06 02:19:25

您可以在spread包中使用tidyr来实现这一点,确保保留出现在两个列表中的所有n和m值,即使它们没有出现在C中:

代码语言:javascript
复制
library(tidyr)
## Replicating the data
listN = list("n1","n2","n3","n4","n5")
listM = list("m1","m2","m3","m4","m5")
C = data.frame(n=c("n1","n2","n3"),m=c("m1","m2","m3"),I=c(100,300,400))
   n  m   I
1 n1 m1 100
2 n2 m2 300
3 n3 m3 400

## Defining factor levels of C using listM and listN, and keeping unused levels when doing the spread
C$n = factor(C$n,levels=unlist(listN))
C$m = factor(C$m,levels=unlist(listM))
res = spread(C,key="n",value="I",drop=F)

这将返回:

代码语言:javascript
复制
   m  n1  n2  n3 n4 n5
1 m1 100  NA  NA NA NA
2 m2  NA 300  NA NA NA
3 m3  NA  NA 400 NA NA
4 m4  NA  NA  NA NA NA
5 m5  NA  NA  NA NA NA
票数 1
EN

Stack Overflow用户

发布于 2017-06-06 02:23:45

我肯定有人有一种更干净的方法来实现以下功能,我很乐意知道。您的数据还没有真正准备好:请参阅How to make a great R Reproducible Example。但是,给出数据的“原样”,并假设您并不真正想要第一行的标题为'n1‘。以下解决方案需要reshape2包:

代码语言:javascript
复制
N=c('n1','n2','n3','n4')
M=c('m1','m2','m3','m4','m5')
C=data.frame(
  X1=c('n1','n1'),
  X2=c('m1','m2'),
  C=c(100, 300)
)

我们将数据定义为上面所示。现在让我们把它合并起来。

代码语言:javascript
复制
X = merge(N, M)

让我们将NAs添加到data.frame中,以便在定义项时将其空白。

代码语言:javascript
复制
C$C <- NA

C$C <- C[which(C$X1 %in% N & C$X2 %in% M),'C']

D = merge(N, M, all=TRUE)
names(D) <- c('X1','X2')
names(X) <- c('X1','X2')

E = merge(D, C, all = TRUE, by=c('X1', 'X2'))

library(reshape2)
reshape2::dcast(E, X2 + C ~ X1, drop=FALSE, value.var='C')

希望这能帮助你,直到其他人能解释得更好。

编辑:因为@Lamia超过了我,所以我比较了示例的system.time值。。。@Lamia的回答是我的机器上十位代表中的0.032 +/- 0.032。

票数 0
EN

Stack Overflow用户

发布于 2017-06-06 03:55:30

我们可以用索引方法

代码语言:javascript
复制
m1 <- matrix(0, length(listM), length(listN), dimnames = list(unlist(listM), unlist(listN)))
m1[cbind(match(as.character(C$m), rownames(m1)), 
                  match(as.character(C$n), colnames(m1)))] <- C$I
m1
#    n1  n2  n3 n4 n5
#m1 100   0   0  0  0
#m2   0 300   0  0  0
#m3   0   0 400  0  0
#m4   0   0   0  0  0
#m5   0   0   0  0  0

数据

代码语言:javascript
复制
listN <- list("n1","n2","n3","n4","n5")
listM <- list("m1","m2","m3","m4","m5")
C <- data.frame(n=c("n1","n2","n3"),m=c("m1","m2","m3"),I=c(100,300,400))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44380151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档