【问题标题】:Creating a contingency table from multiple logical variables in R从 R 中的多个逻辑变量创建列联表
【发布时间】:2016-12-29 15:28:05
【问题描述】:

我目前有一个数据框,其中包含一个因素和多个逻辑变量(在某种程度上对应于单个变量的各种条件,但不相互排斥)。

做一个简单的比较,我想计算来自不同类型人的汽车,但有人可以拥有各种汽车。假设我还想计算他们的手机类型(也不排除彼此)。

虚拟数据:

data = data.frame(Profession = c("Manager", "Manager", "Developer", "Developer"), Ford = c(T, F, F, T), Renault = c(F, T, T, F), Ferrari = c(T, F, F, F), iPhone = c(T, T, T, F), Android = c(T, T, F, T))

#   Profession  Ford Renault Ferrari iPhone Android
# 1    Manager  TRUE   FALSE    TRUE   TRUE    TRUE
# 2    Manager FALSE    TRUE   FALSE   TRUE    TRUE
# 3  Developer FALSE    TRUE   FALSE   TRUE   FALSE
# 4  Developer  TRUE   FALSE   FALSE  FALSE    TRUE

我想获得一个列联表,其中包含按职业划分的汽车和电话类型的计数。当然,我对所有FALSE(或NA)值都不感兴趣。 理想情况下,我想将其呈现在具有变量层次结构的表中,例如:

          Manager Developer (Total)
Car
- Ford          1         1       2
- Renault       1         1       2
- Ferrari       1         0       1
Phone
- iPhone        2         1       3
- Android       2         1       3

我曾试图与table 混在一起,但我必须承认我很迷茫,不知道从哪里开始。

【问题讨论】:

    标签: r contingency


    【解决方案1】:

    这应该可行:

    # split the data by profession, result is a list with a dataframe for every profession
    data2 = split(data[, -1], data$Profession)
    # colSums is then equal to the frequencies per Ford, Renault, etc.
    # that is binded into a dataframe for convenience
    tb = data.frame(lapply(data2, colSums))
    # add a column for total
    tb$Total = rowSums(tb)
    

    【讨论】:

    • tb = data.frame(lapply(data2, colSums)) 应该是tb = data.frame(lapply(data2, colSums, na.rm = TRUE))
    【解决方案2】:

    您也可以使用reshape2 包来执行此操作。

    recast(dat, variable ~ Profession, id.var = 1, fun=sum, margins="Profession")
    
    #   variable Developer Manager (all)
    # 1     Ford         1       1     2
    # 2  Renault         1       1     2
    # 3  Ferrari         0       1     1
    # 4   iPhone         1       2     3
    # 5  Android         1       2     3
    

    recast 一步完成,但要了解变量名称为何出现在公式中,请查看

    melt(dat, 1)
    

    然后

    dcast(melt(dat, 1), variable ~ Profession, value.var='value', fun=sum)
    

    【讨论】:

    • 谢谢!这个recast功能真的很强大!并且避免了我使用其他解决方案所必需的一堆清洁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2020-06-23
    • 2015-11-15
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多