代码之家  ›  专栏  ›  技术社区  ›  buhtz

从数据帧计算列式条件分布

  •  0
  • buhtz  · 技术社区  · 8 年前

    请随意修改 书名 关于那个问题。

    我有一个 data.frame 有三个 拉贝尔德 变量。

    require(Hmisc)
    
    set.seed(0)
    df <- data.frame(var1=sample(c(0, 1, NA), 100, replace=TRUE),
                     var2=sample(c(0, 1, NA), 100, replace=TRUE),
                     var3=sample(c(0, 1, NA), 100, replace=TRUE))
    label(df$var1) <- "One"
    label(df$var2) <- "Two"
    label(df$var3) <- "Three"
    

    我想计算百分比,然后像这样显示它们的组合

             0    1 <NA>
    One   0.27 0.37 0.36
    Two   0.29 0.41 0.30
    Three 0.45 0.31 0.24
    

    下面的代码确实有效。但我的问题是如何简化这段代码?变量的名称是编号的。你可以这样做来获取所有相关的变量

    names(df)[startsWith(names(df), "var")]
    

    这个 指向 变量的数量是可变的/灵活的。;) 我从那里得到名字前缀(在这个例子中 var v3_5_* , v4_1_* ,…

    有什么想法或提示吗?

    这是完整的工作(但不是简化)代码。

    #!/usr/bin/env Rscript
    
    set.seed(0)
    df <- data.frame(var1=sample(c(0, 1, NA), 100, replace=TRUE),
                     var2=sample(c(0, 1, NA), 100, replace=TRUE),
                     var3=sample(c(0, 1, NA), 100, replace=TRUE))
    label(df$var1) <- "One"
    label(df$var2) <- "Two"
    label(df$var3) <- "Three"
    
    t1 <- table(df$var1, useNA="always")
    t1 <- 100 / sum(t1) * t1 / 100
    
    t2 <- table(df$var2, useNA="always")
    t2 <- 100 / sum(t2) * t2 / 100
    
    t3 <- table(df$var3, useNA="always")
    t3 <- 100 / sum(t3) * t3 / 100
    
    m <- rbind(t1, t2, t3)
    rownames(m) <- c(label(df$var1),
                     label(df$var2),
                     label(df$var3))
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Weihuang Wong    8 年前

    方法是运行 table 在列上使用 apply

    m <- apply(df, MAR = 2, table, useNA = "always")
    m <- t(prop.table(m, margin = 2))
    rownames(m) <- sapply(df, label)
    

    在哪里? prop.table(m, margin = 2) 计算列元素除以列和(本质上是 t1 / sum(t1) 在上面做)和 label 来自 Hmisc 包裹。我们得到:

    m
    #          0    1 <NA>
    # One   0.27 0.37 0.36
    # Two   0.29 0.41 0.30
    # Three 0.45 0.31 0.24
    
        2
  •  1
  •   rg255    8 年前

    使用 table 正如您已经这样做了:

    rbind(
      as.numeric(table(df[,1], useNA = "always")), 
      as.numeric(table(df[,2], useNA = "always")), 
      as.numeric(table(df[,3], useNA = "always")))/100