我有变量,它是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变量中名称的子集。
有人会帮我解决这个问题吗?
答案 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
,它会返回一个向量而不是列表。