【问题标题】:Extract information from one matrix through another matrix通过另一个矩阵从一个矩阵中提取信息
【发布时间】:2017-11-26 19:29:15
【问题描述】:

我有 2 个矩阵,一个是物种 x 特征,第二个是站点 x 物种(存在/不存在)。我需要第三个矩阵站点 x 特征,并且在每一列中,我将有多个值(一个站点的所有物种的所有值)。我怎样才能做到这一点?通过另一个矩阵提取一个矩阵的信息?我只是R的初学者...

我将站点 x 物种和cbind 转置了 2 个矩阵,但结果是一个矩阵中的所有列...

trait <- read.table("trait_matrix_final.txt", head=T, sep="\t", dec=',', row.names=1)
com   <- read.table("community_matrix2.txt",  head=T, sep="\t", dec=',', row.names=1)
comt  <- t(com)
new   <- cbind(trait, comt)

我尝试将两个矩阵相乘,但这是不可能的,因为我有连续和分类数据。

编辑:

互补的 cmets:我有连续的(例如体型)和分类变量(具有值的日常活动:夜间、昼夜或两者)。因此,如果我在站点 1 有 3 个物种,我想获得站点 1 的这 3 个物种的平均体型。对于分类变量,如果 3 个物种具有以下值:物种 1= 夜间,物种 2= 夜间和物种3 =diurnal,该列将类似于:nocturnal+diurnal 或 nocturnal.diurnal。我的第三个矩阵将具有与第一个矩阵中相同的列数(物种 x 性状),但这些性状是特定站点的所有物种的平均值。

【问题讨论】:

  • 分享您的代码...到目前为止您尝试了什么??
  • 嘿Akshay,我刚刚编辑了我的问题

标签: r matrix extract


【解决方案1】:

提供reproducible example 非常有用,因此 SO 社区可以帮助您解决问题。

编辑后:

只有当该矩阵的所有条目都属于同一类时(例如,所有numeric 或所有character),您才应该将数据存储在matrix 类的对象中。因为您的第一个矩阵同时具有数字值和字符值,所以最好将其格式化为data.frame。请参阅this post 了解更多信息。

假设您每个物种有 5 个特征,每个站点 20 个物种,以及 10 个站点,我将生成一些数据:

n.traits <- 5
n.species <- 20
n.sites <- 10

traits.names <- paste ("trait", 1:n.traits, sep = "_")
species.names <- paste ("spec", 1:n.species, sep = "_")
sites.names <- paste ("site", 1:n.sites, sep = "_")


# species*traits matrix
set.seed (4)
mat1 <- as.data.frame (matrix (replicate (n = n.traits, rnorm (n = n.species)), nrow = n.species, ncol = n.traits, dimnames = list (species.names, traits.names)))
mat1
set.seed (89)
mat1[, 2] <- sample (x = c ("diurnal", "nocturnal"), size = nrow (mat1), replace = T)
mat1

# site*species matrix
set.seed (6)
mat2 <- matrix (replicate (n = n.species, rbinom (n = n.sites, size = 1, prob = 0.8)), nrow = n.sites, ncol = n.species, dimnames = list (sites.names, species.names))
mat2

遵循for 循环将平均每个站点的物种特征:

# sites*traits matrix
mat3 <- as.data.frame (matrix (NA, nrow = n.sites, ncol = n.traits, dimnames = list (sites.names, traits.names)))

for (i in 1:n.sites){
  spec_per_site_boolean <- mat2[i, ] == 1
  mat1_subset <- mat1[spec_per_site_boolean, ]
  
  for (j in 1:n.traits){
    if (is.numeric (mat1_subset[,j]))
      mat3[i,j] <- mean (mat1_subset[,j])
    else 
        mat3[i,j] <- paste (sort (unique(mat1_subset[,j])), collapse = ".")
  }
}
mat3

请注意,第三个矩阵的列数与第一个矩阵相同(例如ncol (mat1) == ncol (mat3)),但行数不同(例如nrow (mat1) != nrow (mat3))。

【讨论】:

  • 感谢新手_R的帮助!但这不是我需要的,也许我没有解释好。我编辑我的问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多