我有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)
我试图将两个矩阵相乘,但这是不可能的,因为我有连续的分类数据。
补充评论:我有连续的(例如体型)和分类变量(每日活动的值为:夜间,昼夜或两者)。因此,如果我在站点1中有3种物种,我想获得这些3种物种的平均体型。对于分类变量,如果3种物种具有这些值:物种1 =夜间物种,物种2 =夜间物种和物种3 =昼夜,列将是这样的:夜间+昼夜或夜间。昼夜。我的第三个矩阵将具有与第一个矩阵(物种x性状)相同的列数,但特征站点的所有物种的特征均为平均值。
答案 0 :(得分:0)
提供reproducible example非常有用,因此SO社区可以帮助您解决问题。
只有当该矩阵的所有条目属于同一类(例如,所有listOfTraits <- c('mass', 'head', 'cbl')
resultList <- lapply(listOfTraits, FUN = function(trait) {
if (var.test(male[[trait]],female[[trait]])$p.value < 0.05) {
t.test(male[[trait]],female[[trait]], var = F)
} else{
t.test(male[[trait]],female[[trait]], var = T)
}
})
或全部listOfTraits <- c('mass', 'head', 'cbl')
resultList <- lapply(listOfTraits, FUN = function(trait) {
if (var.test(male[[trait]],female[[trait]])$p.value < 0.05) {
x <- t.test(male[[trait]],female[[trait]], var = T)
names(x$estimate) <- c(paste0('male_',trait),paste0('female_',trait))
x$data.name <- paste0('male_',trait, " and ",paste0('female_',trait))
} else{
x <- t.test(male[[trait]],female[[trait]], var = T)
names(x$estimate) <- c(paste0('male_',trait),paste0('female_',trait))
x$data.name <- paste0('male_',trait, " and ",paste0('female_',trait))
}
x
})
)时,才应将数据存储在类matrix
的对象中。由于您的第一个矩阵同时具有数字和字符值,因此最好将其格式化为numeric
。有关详细信息,请参阅this post。
假设每个物种 5个特征,每个站点 20种, 10个站点,我会生成一些数据:
character
跟随data.frame
循环将为每个站点平均物种间的特征:
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
)。< / p>