在R中使用列表子集一个data.frame,有时会成功,但并非总是成功?

问题描述 投票:0回答:1

我试图在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, ]

enter image description here

file1和2可在这里获得。https:/filebin.netzrzax0qt6n1gwszu。

r dataframe subset
1个回答
0
投票

拓展一下@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条目。

© www.soinside.com 2019 - 2024. All rights reserved.