【问题标题】:Tabulating multiple response questions制表多项回答问题
【发布时间】:2012-07-05 16:12:24
【问题描述】:

假设我有一个有四个选项的问题,而受访者可以选择零或这四个选项的任意组合。这些变量被命名为ABCD,响应存储在data.frame 中,如下所示。

set.seed(1)
dat = data.frame(A = sample(c(0, 1), 20, replace=TRUE), 
                 B = sample(c(0, 1), 20, replace=TRUE), 
                 C = sample(c(0, 1), 20, replace=TRUE),
                 D = sample(c(0, 1), 20, replace=TRUE))

我可以通过执行以下操作将响应组合制成表格(例如,有多少响应仅使用A,或A+B,或C+D,等等):

data.frame(table(dat))
#    A B C D Freq
# 1  0 0 0 0    2
# 2  1 0 0 0    2
# 3  0 1 0 0    0
# 4  1 1 0 0    1
# 5  0 0 1 0    1
# 6  1 0 1 0    3
# 7  0 1 1 0    0
# 8  1 1 1 0    2
# 9  0 0 0 1    0
# 10 1 0 0 1    2
# 11 0 1 0 1    1
# 12 1 1 0 1    1
# 13 0 0 1 1    2
# 14 1 0 1 1    0
# 15 0 1 1 1    3
# 16 1 1 1 1    0

我现在想创建一个新列来显示此输出所代表的字母组合。例如,第 4 行表示A+B 响应的计数,第 14 行表示A+C+D 响应的计数。

我认为apply 函数之一在这里会很有用,但我不确定如何继续。

【问题讨论】:

    标签: r apply


    【解决方案1】:
    dat.t <- data.frame(table(dat))    
    dat.t$combn <- apply(dat.t[,1:4] == 1, 1, function(x) paste(names(dat)[x], collapse=' + '))
    
    > dat.t
       A B C D Freq         combn
    1  0 0 0 0    2              
    2  1 0 0 0    2             A
    3  0 1 0 0    0             B
    4  1 1 0 0    1         A + B
    5  0 0 1 0    1             C
    6  1 0 1 0    3         A + C
    7  0 1 1 0    0         B + C
    8  1 1 1 0    2     A + B + C
    9  0 0 0 1    0             D
    10 1 0 0 1    2         A + D
    11 0 1 0 1    1         B + D
    12 1 1 0 1    1     A + B + D
    13 0 0 1 1    2         C + D
    14 1 0 1 1    0     A + C + D
    15 0 1 1 1    3     B + C + D
    16 1 1 1 1    0 A + B + C + D
    > 
    

    【讨论】:

    • @mrdwab 我的技术是根据应用程序从单行或单列开始,然后创建一个可以满足我需求的函数。然后扩展至apply 是直截了当的。 lapply 也是如此。如果您有一个适用于单个项目的函数,lapply 在类似项目列表上将给出所需的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多