Вопрос по indexing, dataframe, r, matrix – Заполнение матрицы с использованием кадра данных в R

1

У меня пустая матрицаm:

m <- matrix(0, nrow = 4, ncol = 2, byrow = TRUE,
            dimnames = list(c("sp1", "sp2", "sp3", "sp4"),
                            c("x", "y")))

И нужно заполнить матрицу с использованием фрейма данных d

d <- data.frame(site = c("x", "y", "u", "v"), 
                species = c("sp1", "sp1", "sp1", "sp1"), 
                freq = c(0.2, 0.3, 0.5, 0.1))

так что еслиrowname(m) равноd[, "species"] а такжеm[, "x"] равноd[, "site"] затемd[, "freq"] введено в правильном месте в матрице m, то есть возвращено:

m <- matrix(c(0.2, 0, 0, 0, 0, 0, 0, 0), nrow = 4, ncol = 2, byrow = TRUE, 
            dimnames = list(c("sp1", "sp2", "sp3", "sp4"),
                            c("x", "y")))

Я пытался:

m[d[, c("species", "x")]] <- d[, "freq"]

Я подозреваю, что не делаю индексацию фрейма данных должным образом? Есть идеи? Благодарю.

Ваш Ответ

2   ответа
1

Настройка данных

m <- matrix(0, nrow = 4, ncol = 2, byrow = TRUE,
            dimnames = list(c("sp1", "sp2", "sp3", "sp4"),
                            c("x", "y")))
d <- data.frame(site = c("x", "y", "u", "v"), 
              species = c("sp1", "sp1", "sp1", "sp1"), 
              freq = c(0.2, 0.3, 0.5, 0.1))

Делать расчеты

library(reshape)
dc <- cast(species ~ site, data = d, value = "freq")
md <- as.data.frame(m)
md$species <- rownames(md)
md <- merge(
    md, 
    dc[, c("species", "x")], 
    all.x = TRUE, 
    by = "species", 
    suffixes = c("", ".tmp"))
md$x[!is.na(md$x.tmp)] <- md$x.tmp[!is.na(md$x.tmp)]
md$x.tmp <- NULL

Вы могли бы упростить код при преобразовании d $ site в фактор, содержащий имена строк (m)

d <- data.frame(
    site = c("x", "y", "u", "v"), 
    species = factor(
        c("sp1", "sp1", "sp1", "sp1"), 
        levels = c("sp1", "sp2", "sp3", "sp4")), 
    freq = c(0.2, 0.3, 0.5, 0.1))
cast(species ~ site, data = d, value = "freq", add.missing = TRUE)

Вы получаете частоты y, u и v в качестве бонуса. Если они вам не нужны, удалите их из априори

cast(species ~ site, data = d, value = "freq", add.missing = TRUE, 
    subset = site == "x")

Используйте аргумент заполнения, если вы хотите преобразовать NA в другое значение

cast(species ~ site, data = d, value = "freq", add.missing = TRUE, 
    subset = site == "x", fill = 0)
Спасибо! Я закончил тем, что использовал ответ от plannapus, потому что он короче. Ваша версия более стабильна? Elizabeth
Я добавил к коду упрощенный код. Все зависит от того, определено ли m или вы можете создать m из d.
2

for(i in 1:nrow(d)){m[rownames(m)==d[i,2],colnames(m)==d[i,1]] <- d[i,3]}
Я, честно говоря, не могу думать ни о ком.
Спасибо! Это сработало. Однако вы предвидите какие-либо проблемы со стабильностью? Elizabeth

Похожие вопросы