在RR中集成2个列表和数据farme

时间:2017-06-06 01:42:46

标签: r list dataframe integrate

请您就我可以使用的R代码提出建议,以便进行以下操作:

  1. 我有2个“基因组坐标”列表:列表由代表基因组坐标的数字组成;
  2. 让我们说列表n1 n2 n3 n4

    M

    和列表m1 m2 m3 m4 m5

    C
    1. 和数据帧n1; m1; 100 n1; m2; 300 ,其中对于上面列表中的一些坐标对(n,m),我们有一个数值强度;
    2. 例如:

      N

      问题是:为了集成列表M,列表C和数据帧N,我可以使用哪些最有效的R代码,以便获取数据框:

      • 列出M作为列名称
      • 列出N作为行名称
      • M * C单元格中的值,对应于数据框 n1 n2 n3 n4 m1 100 - - - m2 300 - - - m3 - - - - m4 - - - - m5 - - - - 中的数值。

      一个小例子是:

      {{1}}

3 个答案:

答案 0 :(得分:1)

您可以使用spread包中的tidyr执行此操作,确保将两个列表中显示的所有n和m值保留,即使它们未显示在C:中< / p>

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)

返回:

   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 :(得分:0)

我确定某人有更清洁的方式来实施以下内容,我很乐意知道。您的数据尚未准备好MWE:请参阅How to make a great R Reproducible Example。但是,鉴于数据&#34; as-is&#34;并假设你真的不想要第一行标题为&#39; n1&#39;。以下解决方案需要reshape2包:

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)
)

我们已经定义了上述数据。现在让我们将它们合并在一起。

X = merge(N, M)

我们将NA添加到data.frame,以便在我们定义项目时将其消隐。

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.01 +/- 0.032,超过10个代表。

答案 2 :(得分:0)

我们可以使用索引方法

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

数据

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))