【问题标题】:Extract Observation from a Matrix从矩阵中提取观察
【发布时间】:2023-06-16 10:16:02
【问题描述】:

我有一个矩阵(见上文)。我有成排的植物物种和亚种的名称。

我想生成仅包含物种的相同矩阵和仅包含子物种的矩阵。

我的初始矩阵中的物种由一个词(abeliaabis)组成,而子物种总是包含两个词(abies alba 等)。

我如何在 R 中做到这一点?

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拨打tour 并阅读How to Ask 以了解我们对这里问题的期望。请注意,我们不提供从头开始的编码服务。请告诉我们您已经尝试过什么,它是如何失败的,我们或许可以提供帮助。

标签: r variables select matrix


【解决方案1】:

假设矩阵被称为m,你可以试试这个:

species_rows <- lengths(strsplit(rownames(m)," "))==1 #split the rownames at whitespaces, retain only rows that are not split (vector of length 1).
species_mat <- m[species_rows,] #logical subsetting
subspecies_mat <- m[!species_rows,] #logical subsetting with negation

感谢@akrun 指出lapply(..,length) 可以替换为lengths()


甚至更简单:

species_rows <- !grepl(" ",rownames(m)) # does the row.name NOT contain a whitespace? (TRUE / FALSE)
species_mat <- m[species_rows,]
subspecies_mat <- m[!species_rows,]

【讨论】:

    【解决方案2】:

    欢迎来到 SO,如建议的那样,如果您为您的问题提供示例数据会很好。

    也就是说,我认为你可以做到:

    # First, generate data:
    a <- matrix(sample(c(0, 1), 20), ncol = 4)
    rownames(a) <- c("abies", 
                     "abies alba", 
                     "abies amabilis", 
                     "abies balsamea", 
                     "abies concolor")
    

    然后,您可以使用grep 查找哪些名称包含空格:

    sp <- grep(" ", rownames(a))
    

    最后,分配给新矩阵:

    subspecies <- a[sp,]
    species <- a[-sp,]
    

    作为旁注,我建议使用数据框而不是矩阵,并将名称分配给变量,而不是行名。

    【讨论】: