【问题标题】:subsetting a data.frame using a list in R works sometimes but not always?使用 R 中的列表对 data.frame 进行子集有时但并非总是如此?
【发布时间】:2020-06-12 10:06:17
【问题描述】:

我正在尝试使用另一个数据框 (file2) 的行名对 R 中的 data.frame (file1) 进行子集化。 file2 中的总行数为 166,如果我进一步对它进行子集化,它会减少到 50。现在这是有趣的部分:如果我在子集化后使用 file2 的行名(50 行),创建一个包含 50 个字符的列表,然后然后使用该列表对数据帧的 file1 子集进行子集工作正常!

file2 <-subset(file2, Compartment=="Feces")
file2=droplevels(file2, reorder=FALSE)
list=rownames(file2)
new=file1[list, ]

但是,如果我按原样使用 file2(所有 166 行)而不设置子集,那么它就不起作用! 它将 file1 减少到 166 行,但行中充满了 NA,并且一些行名(特别是以 ET 开头的行名和另外一个)已经丢失!

list=rownames(file2)
new=file1[list, ]

file1 和 2 在这里可用: https://filebin.net/zrzax0qt6n1gwszu

【问题讨论】:

  • 发生这种情况是因为在您的第二种方法中,您使用的行名在 file1 中不存在。当你使用这样的行名时,它必须返回一些东西,因为它找不到任何东西,它返回 NA 行。检查此示例:list = rownames(mtcars)[c(3,5)]; list2 = c(list, "unknown"); mtcars[list,]; mtcars[list2,]。为了避免这种行为,您可以改用 mtcars[rownames(mtcars) %in% list2,] 之类的东西。
  • 该死!你是对的,但文件名应该是一样的!无论如何,感谢您的快速响应并感谢 mtcars!

标签: r dataframe subset


【解决方案1】:

只是扩展@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 的向量,而不是像 file2 的行那样的 166 行。

为避免您遇到的问题,您可以在行名之间使用%in% 运算符

new <- file1[rownames(file1) %in% rownames(file2), ]

根据file2 的行名,哪个子集file1。在这种情况下,new 是一个包含 109 行且没有空/NA 条目的数据框。

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多