Вставить столбцы двух фреймов данных - PullRequest
6 голосов
/ 03 ноября 2011

Мне хочется иногда вставлять столбцы из разных фреймов данных (таблиц, матриц и т. Д.). Например, у меня есть таблица средств и таблица стандартных разработчиков. Я хочу, чтобы они были вставлены вместе с sd в набор скобок для латексной печати. Я подозреваю, что есть дружественное решение plyr, но не могу придумать, как работать с двумя фреймами данных (я попытался сохранить фреймы данных в виде списка и использовать ldply, но это была моя первая попытка использовать функцию plyr списка, и она сгорела.

Заранее спасибо.

#=========
#fake data
#=========
x<-mtcars[1:3,1:3]
y<-mtcars[1:3,8:10]


#==========================
#A column pasting function
#==========================
meansd<-function(x, y){
x<-round(x, dig=2)
y<-round(y, dig=2)
paste(x, "(", y, ")", sep="")
}

Насколько я понял.

желаемый результат Имена столбцов не нужны. Мне все равно, будет ли возвращаемая матрица или датафрейм.

16.46(0)  0(1)  1(4)
17.02(0)  0(1)  1(4)
18.61(1)  1(1)  1(4)

Ответы [ 3 ]

7 голосов
/ 03 ноября 2011

Вот подход, использующий plyr

t(ldply(1:NCOL(x), function(i) meansd(x[,i], y[,i])))
7 голосов
/ 03 ноября 2011

Как насчет mapply?

x <- mtcars[1:3,1:3]
y <- mtcars[1:3,8:10]

mypaste <- function(x,y) paste(x, "(", y, ")", sep="")

mapply(mypaste, x,y)

     mpg       cyl    disp    
[1,] "21(0)"   "6(1)" "160(4)"
[2,] "21(0)"   "6(1)" "160(4)"
[3,] "22.8(1)" "4(1)" "108(4)"
4 голосов
/ 03 ноября 2011

Вот ваша функция, отредактированная для циклического прохождения и вставки каждого столбца. Это дает желаемый результат, но, вероятно, есть более умный способ сделать это.

meansd<-function(x, y){
    x<-round(x, digits = 2)
    y<-round(y, digits = 2)
    out <- matrix(ncol = dim(x)[1], nrow = dim(x)[2])
    for(i in 1:dim(x)[1])
    {
        out[i, ] <-paste(x[i, ], "(", y[i, ], ")", sep="")
    }
    return(out)
}
...