如何编写将数据帧转换为另一个数据帧的函数?

时间:2016-07-29 15:53:57

标签: r dataframe contingency

假设我有以下形式的数据框:

        .menu {
           background: darkgrey;
        }


        ul {                
            height: 20%;
            list-style-type: none;
            width: 300px; 
            margin: auto
        }

        li {   
            display: inline-block;
            padding: 0% 5% 0% 5%;

        }

我想编写一个函数,将上面的数据框转换为一个列联表,如下所示:

    N1  N2  N3  N4  N5  N6
     1   0   0   1   0   0
     0   1   0   1   0   1
     1   1   1   0   0   1
     0   0   0   1   1   0
     1   1   0   0   0   1

我可以指定哪些变量构成列和行。如果可能的话,我可以在其中替换不同的数据帧。谢谢!

2 个答案:

答案 0 :(得分:4)

假设df是您的数据框:

with(df, t(table(paste0(N2, N3), N5)))
N5  00 10 11
  0  1  2  1
  1  1  0  0

答案 1 :(得分:1)

也许不是一个完美的解决方案,但请考虑这个功能:

f <- function(df, select) {

    generate.levels <- function(...) {
        x <- do.call(expand.grid, rev(list(...)))
        if (ncol(x) > 1) x <- x[,ncol(x):1]
        for (i in 1:ncol(x)) x[,i] <- sprintf("%s=%s", names(x)[i], x[,i])
        x <- apply(x, 1, paste, collapse=",")
        x <- paste0("(", x, ")")
        x
    }

    x <- subset(df, select=select)
    l <- do.call(generate.levels, lapply(x, unique))
    for (i in 1:ncol(x)) x[,i] <- sprintf("%s=%s", names(x)[i], x[,i])
    x <- apply(x, 1, paste, collapse=",")
    x <- paste0("(", x, ")")
    factor(x, levels=l)
}

table(f(df, "N5"), f(df, c("N2", "N3")))

       (N2=0,N3=0) (N2=0,N3=1) (N2=1,N3=0) (N2=1,N3=1)
(N5=0)           1           0           2           1
(N5=1)           1           0           0           0