将vector与其他数据类型结合使用时,union()函数无法正常工作

时间:2014-05-28 08:12:45

标签: r

我有变量,它是vector并包含行名。我想用其他矩阵的行名称取这个向量的unnion,但是当我这样做时,它无法正常工作。基本上它把所有的东西放在一起,而不关心重复,....

这是我的努力:

step 1: put the names in vector, which I read it from list of matrix :

name<-c()
name<-lapply(ismr0, function(x){

name<-union(name, rownames(x))
return(name)

})

> length(name)
[1] 733
> 

第二步无效;

     rn <- union(rownames(ismr0[[1]]), name)
> length(rn)
[1] 1180
> 

> ismr0[[1]][1:4,]
             mature        RPM
MIMAT0000062 mature 49791.5560
MIMAT0000063 mature 92858.1285
MIMAT0000064 mature 10418.8532
MIMAT0000065 mature   404.7618
> 

但我希望长度为733,因为ismr0 [[1]]的行名是name变量中名称的子集。

有人会帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

正如您在评论中所猜测的那样,您正在使用字符向量和列表上的联合。如果我们需要从列表中获取所有唯一的rownames,请尝试以下示例:

#dummy data
a<-matrix(1:4,ncol=1)
b<-matrix(1:4,ncol=1)
c<-matrix(1:4,ncol=1)
rownames(a) <- letters[c(2,3,5,7)]
rownames(b) <- letters[c(2,4,5,7)]
rownames(c) <- letters[c(2,3,6,7)]
ismr0 <-list(a,b,c)

#get unique names
name <- unique(unlist(lapply(ismr0,rownames)))

#check with union
rn <- union(rownames(ismr0[[1]]), name)
length(name)==length(rn)

答案 1 :(得分:1)

由于lapply返回列表,因此无法获得预期效果。我运行了一个包含3个data.frames的列表示例,它给了我:

[[1]]
[1] "l1" "l2" "l3" "l4" "l5"    # first df rownames

[[2]]
[1] "l6"  "l7"  "l8"  "l9"  "l10"    # second df rownames

[[3]]
[1] "l11" "l12" "l13" "l14" "l15"    # third df rownames

这是一个清单。 然后,行union(rownames(ismr0[[1]]), name)name的元素添加到列表中,该列表不包含那些单个元素,您会得到类似的内容:

[[1]]
[1] "l1" "l2" "l3" "l4" "l5"

[[2]]
[1] "l6"  "l7"  "l8"  "l9"  "l10"

[[3]]
[1] "l11" "l12" "l13" "l14" "l15"

[[4]]
[1] "l1"

[[5]]
[1] "l2"

您需要使用sapply,它会返回一个向量而不是列表。