Как мне сопоставить таблицу сопряженности с другой, применяя функцию к каждому элементу в R? - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть таблица сопряженности 2D в R ; это объект таблицы. Я хочу превратить его в новую таблицу, применяя функцию к каждому из ее элементов. Я посмотрел на sapply, tapply и т. Д., Но все они направлены на обобщение / агрегацию данных. Я написал свою собственную функцию отображения, которая делает это, и я воспроизвожу ее ниже:

map.table = function(t,fn)
{
    rows = dim(t)[1]
    columns = dim(t)[2]
    x = matrix(nrow=rows, ncol=columns)

    rownames(x) = unlist(dimnames(bush.t)[1], use.names=FALSE)
    colnames(x) = unlist(dimnames(bush.t)[2], use.names=FALSE)
    for(row in seq(from=1, to=rows))
    {
        for(column in seq(from=1, to=columns))
        {
            x[row,column] = fn(t[row,column])
        }
    }
    as.table(x)
}

Это создает матрицу с нуля, заполняет имена измерений и элементы. Есть ли лучший способ сделать это? Существует ли функция / пакет R , которая уже выполняет эту функцию?

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

Вы, вероятно, можете просто использовать apply:

set.seed(21)
x <- data.frame(a=sample(letters[1:5],20,TRUE),
                b=sample(letters[1:5],20,TRUE))
y <- table(x)
z <- as.table(apply(y, 1:2, sqrt))
4 голосов
/ 23 ноября 2011

Почему вы идете ко всем этим неприятностям? Вы должны быть в состоянии сделать это:

fn(t)

(Но также подумайте об использовании другого имени для вашей таблицы, поскольку t - это очень хорошее имя базовой функции. Сначала я подумал, что вы транспонировали свои строки и столбцы.)

Если ваша функция не работает с векторами, есть вероятность, что вы можете убедить ее сделать это. Попробуйте это:

vfn <- Vectorize(fn)
t2[] <- vfn(t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...