在两个条件下选择子集

时间:2017-07-21 15:15:06

标签: r matrix

我一直在努力研究R的特定方面,即选择满足一些参数的数据子集。例如,假设我有一个基质Y和5种丰富的物种:

 site    spc1        spc2         spc3          spc4         spc5 
 195     1            1            3            0            15
 196     3            15           4            0            18
 197     0            0            0            85            0
 198     2            1            3            0            85
 199     0            0            0            75            0

假设spc4存在问题,无法正确识别。我想从我的矩阵Y中取出所有其他spc的丰度之和等于0并且spc4的丰度大于0的所有行,并且将新矩阵存储在另一个矩阵中而不将所有这些行存储在另一个矩阵中叫Z. 我尝试过一些东西,但我似乎不知道如何减去这些感兴趣的行并创建一个新的数据集。 我正在学习如何在此期间创建函数,我正在研究创建If函数的方法。

如果有人有任何想法,我很乐意阅读。

谢谢!

3 个答案:

答案 0 :(得分:1)

假设您已经有一个矩阵mat

library(data.table)
dat <- as.data.table(mat)
spcs <- names(dat)[!names(dat) %in% c("site", "spc4")]
Z <- as.matrix(dat[!(spc4 > 0 & get(spcs) == 0)])

#      site spc1 spc2 spc3 spc4 spc5
# [1,]  195    1    1    3    0   15
# [2,]  196    3   15    4    0   18
# [3,]  198    2    1    3    0   85

答案 1 :(得分:1)

在基地R ......

Z <- subset(Y, !(rowSums(Y[, -1]) == Y[, "spc4"] & Y[, "spc4"] > 0))

Z
  site spc1 spc2 spc3 spc4 spc5
1  195    1    1    3    0   15
2  196    3   15    4    0   18
4  198    2    1    3    0   85

无论Y是矩阵还是数据框,这都应该有效,但在后一种情况下,您可以将Y[,"spc4"]替换为Y$spc4

答案 2 :(得分:0)

如果是数据框,我们可以使用dplyrdt2是最终输出。

# Create example data frame
dt <- read.table(text = "site    spc1        spc2         spc3          spc4         spc5 
 195     1            1            3            0            15
                 196     3            15           4            0            18
                 197     0            0            0            85            0
                 198     2            1            3            0            85
                 199     0            0            0            75            0",
                 header = TRUE, stringsAsFactors = FALSE)

# Load packages
library(dplyr)

# Process data
dt2 <- dt %>%
  filter(!(spc4 != 0 & rowSums(dt %>% select(-site, -spc4)) == 0))