【问题标题】:Using table() to create 3 variable frequency table in R使用 table() 在 R 中创建 3 个可变频率表
【发布时间】:2015-05-25 05:29:51
【问题描述】:

我是 R 新手,正在寻求帮助。我了解以下问题相当简单,并且已经寻找类似的问题。没有人给出我正在寻找的答案 - 任何帮助将不胜感激。

问题:

使用table() 函数为三个变量生成频率表,数据格式为:

    Var1    Var2   Var3
1   0        1        0
2   0        1        0
3   1        1        1
4   0        0        1

其中,0 =“否”,1 =“是”

最终表格采用以下格式,并标有变量和值:

           Var3
           Yes   No
Var1  Yes   1     0
      No    1     2
Var2  Yes   1     2
      No    1     0

到目前为止我所做的尝试:

使用以下代码,我可以生成一个 2 变量表,其中包含变量标签但不包含值(即否和是)。

table(data$Var1, data$Var3, dnn = c("Var1", "Var3"))

看起来像这样:

      Var3
Var1  0  1
   0  2  1
   1  0  1

在尝试标记行和列值时(0 = 否和 1 = 是),我知道可以使用 row.namesresponseName,但是以下尝试标记行名称会出现 all arguments must have the same length 错误。

> table(data$Var1, data$Var2, dnn = c("Var1", "Var2"), row.names = c("No", "Yes"))

我也尝试过使用ftable(),但是使用下面的代码生成的表格形状不正确,导致问题出现的频率不正确。标记行和列值的问题仍然存在。

> ftable(data$Var1, data$Var2, data$Var3, dnn = c("Var1", "Var2", "Var3"))
      Var3  0  1
Var1 Var2             
0     0     0  1
      1     2  0
1     0     0  0
      1     0  1

如果能帮助您使用table() 制作所需形状的表格,我们将不胜感激。

【问题讨论】:

  • 首先将数据转换为因子以解决标签问题:dat <- data.frame(lapply(dat, factor, levels=1:0, labels=c("Yes","No")))
  • 谢谢,这非常有帮助,非常适合解决标签问题。

标签: r frequency


【解决方案1】:

如@thelatemail 所示更改标签后,您可以尝试从library(tables) 改成tabular

library(tables)
data[] <- lapply(data, factor, levels=1:0, labels=c('Yes', 'No'))
tabular(Var1+Var2~Var3, data=data)

 #         Var3   
 #         Yes  No
 #Var1  Yes 1    0 
 #      No  1    2 
 #Var2  Yes 1    2 
 #      No  1    0 

数据

data <- structure(list(Var1 = c(0L, 0L, 1L, 0L), Var2 = c(1L, 1L, 1L, 
0L), Var3 = c(0L, 0L, 1L, 1L)), .Names = c("Var1", "Var2", "Var3"
), class = "data.frame", row.names = c("1", "2", "3", "4"))

【讨论】:

    【解决方案2】:

    最简单的方法可能是使用reshape2 包。首先,您需要将您的数字信息转换为因子,以便它不会将其视为数字。

    data$Var1 <- as.factor(data$Var1)
    data$Var2 <- as.factor(data$Var2)
    data$Var3 <- as.factor(data$Var3)
    

    然后您可以轻松地申请table(data) 以获取您想要的信息。如果你真的想把它转换成你指定的格式,那就把它拉成data.frame,然后根据需要进行转换:

    df <- as.data.frame(table(data))
    library(reshape2)
    dcast(df, Var1+Var2 ~ Var3)
    

    这是输出:

      Var1 Var2 0 1
    1    0    0 0 1
    2    0    1 2 0
    3    1    0 0 0
    4    1    1 0 1
    

    编辑:你可以在数据框上使用ftable,一旦它的所有因素:

    > ftable(data)
              Var3 0 1
    Var1 Var2         
    0    0         0 1
         1         2 0
    1    0         0 0
         1         0 1
    

    【讨论】:

    • 谢谢@chappers,我从哪里得到 reshape2 包?我正在使用 Rstudio,它在默认的软件包列表中不可用。
    • 我刚刚意识到您可以使用ftable 来获得相同的结果(请参阅我的编辑)。如果您对reshape2 感兴趣,只需在控制台中尝试install.packages("reshape2"),它会自动为您安装
    • @chappers - ftable 解决方案并不完全相同 - 答案给出的计数是 Var1 x Var2 x Var3 而不是 Var1 x Var3Var2 x Var3 一起加入
    • 没错@thelatemail,这是在问题中指定的。同样在使用 reshape2 查看输出的形状时,这不是我正在寻找的特定形状。
    • @akrun 所需的形状在问题中定义(第二个代码块)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多