我试图在R中使用另一个数据框(file2)的行名来子集一个data.frame(file1)。file2中的总行数是166,如果我进一步子集它,就会减少到50。现在是有趣的部分。如果我在子集后使用 file2 的 rownames (50 行),创建一个 50 个字符的列表,然后用这个列表来子集 file1 数据框的子集,效果很好!
file2 <-subset(file2, Compartment=="Feces")
file2=droplevels(file2, reorder=FALSE)
list=rownames(file2)
new=file1[list, ]
然而,如果我使用file2的原样(所有166行)而不进行子集,那么它就不能工作!它将file1减少到166行,但行中充满了NAs,一些rownames(特别是以ET和一个更多的开头的)已经丢失了。
list=rownames(file2)
new=file1[list, ]
file1和2可在这里获得。https:/filebin.netzrzax0qt6n1gwszu。
拓展一下@AntoniosK的评论,当你的第二个文件中的一些行名在第一个文件中不存在时,可能会发生这种情况。由于这个原因,R会生成空行。
你可以检查一下,是不是所有的行名都在第一个文件中出现过。file2
存在于 file1
使用以下命令
intersect(rownames(file1), rownames(file2))
# [1] "C1" "C10" "C11" "C12" "C13" "C14" "C15" "C16" "C17" "C18" "C19" "C2" "C20" "C21" "C22"
# [16] "C23" "C24" "C25" "C26" "C27" "C28" "C29" "C3" "C30" "C32" "C33" "C34" "C35" "C36" "C37"
# [31] "C38" "C39" "C4" "C40" "C41" "C42" "C43" "C44" "C45" "C46" "C47" "C48" "C49" "C5" "C50"
# [46] "C51" "C52" "C53" "C54" "C55" "C56" "C57" "C58" "C59" "C6" "C60" "C7" "C8" "C9" "F1"
# [61] "F10" "F11" "F12" "F13" "F14" "F15" "F16" "F17" "F18" "F19" "F2" "F20" "F21" "F22" "F23"
# [76] "F24" "F25" "F26" "F27" "F28" "F29" "F3" "F30" "F31" "F32" "F33" "F34" "F35" "F36" "F37"
# [91] "F38" "F39" "F4" "F40" "F41" "F42" "F43" "F44" "F45" "F46" "F47" "F48" "F49" "F5" "F50"
# [106] "F6" "F7" "F8" "F9"
是一个长度为109的向量,而不是166的行。file2
.
为了避免您所获得的问题,您可以使用 %in%
行名间运算符
new <- file1[rownames(file1) %in% rownames(file2), ]
哪个 file1
根据 file2
的rownames。在这种情况下。new
是一个确实有109行的数据框,没有空NA条目。