美文网首页Cook R诗翔的R语言学习之路
Manipulating Data - 数据框与列联表转换

Manipulating Data - 数据框与列联表转换

作者: 王诗翔 | 来源:发表于2017-11-15 18:36 被阅读22次

问题

你想要在多种情况的一个数据框、每种情况类型计数的数据框以及一个列联表之间转换。

方案

这里有3种数据结构代表相同的信息,但是是以不同的形式:

  • cases: 每一行代表一个情况的数据框
  • ctable: 一个列联表
  • counts: 计数的数据框,每行代表每一种组合的数目
# 每一行代表一种情况
cases <- data.frame(
    Sex=c("M", "M", "F", "F", "F"), 
    Color=c("brown", "blue", "brown", "brown", "brown")
)
cases
#>   Sex Color
#> 1   M brown
#> 2   M  blue
#> 3   F brown
#> 4   F brown
#> 5   F brown

# 一个列联表
ctable <- table(cases)
ctable
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

# 一个每种组合计数的表格
counts <- data.frame(
    Sex=c("F", "M", "F", "M"), 
    Color=c("blue", "blue", "brown", "brown"),
    Freq=c(0, 1, 3, 1)
)
counts
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

将情况记录转为列联表

将情况记录转为列联表(上面已经展示了):

# Cases to Table
ctable  <- table(cases)
ctable
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

# 如果你使用两个向量调用table函数,它将不会给维度添加名字(Sex和Color)
table(cases$Sex, cases$Color)
#>    
#>     blue brown
#>   F    0     3
#>   M    1     1

# 维度名可以通过`dnn`选项手动指定
table(cases$Sex, cases$Color, dnn=c("Sex","Color"))
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1


将情况记录转为计数

它可以用一个数据框代表每一种组合的计数。注意它被转换并存储在countdf变量中:

# Cases to Counts
countdf <- as.data.frame(table(cases))
countdf
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

列联表转为情况记录

countsToCases(as.data.frame(ctable))
#>     Sex Color
#> 2     M  blue
#> 3     F brown
#> 3.1   F brown
#> 3.2   F brown
#> 4     M brown

注意countsToCases函数定义在下面(文章最后)。

列联表转为计数

as.data.frame(ctable)
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

(从这里我们可以看到上一个代码的中间效果)

计数转为情况记录

countsToCases(countdf)
#>     Sex Color
#> 2     M  blue
#> 3     F brown
#> 3.1   F brown
#> 3.2   F brown
#> 4     M brown

这相当于是列联表转为情况记录的第二步。

计数转为列联表

xtabs(Freq ~ Sex+Color, data=countdf)
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

countsToCases() 函数

这个函数使用在上面的例子中:

# Convert from data frame of counts to data frame of cases.
# `countcol` is the name of the column containing the counts
countsToCases <- function(x, countcol = "Freq") {
    # Get the row indices to pull from x
    idx <- rep.int(seq_len(nrow(x)), x[[countcol]])

    # Drop count column
    x[[countcol]] <- NULL

    # Get the rows from x
    x[idx, ]
}


原文链接:http://www.cookbook-r.com/Manipulating_data/Converting_between_data_frames_and_contingency_tables/

相关文章

  • Manipulating Data - 数据框与列联表转换

    问题 你想要在多种情况的一个数据框、每种情况类型计数的数据框以及一个列联表之间转换。 方案 这里有3种数据结构代表...

  • R语言中的数据框与列联表的转换丨数析学院

    问题 在R中,如何实现样本数据框、样本类型组合计数数据框以及数据列联表之间进行相互转换? 指南 下列三个数据结构传...

  • Manipulating Data - 比较数据框

    比较数据框 问题 你想要比较两个或多个数据框并找到在超过一个数据框中出现的行,或者仅在一个数据框中出现的行。 方案...

  • R语言Data Frame数据框常用操作

    R语言Data Frame数据框常用操作 Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成...

  • Manipulating Data - 对数据框的列重新排序

    问题 你想要对一个数据框的列重新排序。 方案 上面例子中对数据框进行索引是将数据框作为一个列表(一个数据框实际上就...

  • Manipulating Data - 重命名数据框的列

    问题 你想要给数据框的列重新命名。 方案 让我们从有三列的一个数据框开始: 最简单的方式是使用plyr包的rena...

  • Data Frame

    概念 Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以...

  • Manipulating Data - 融合数据框

    问题 你想要基于一个给定的列融合两个数据框(像SQL的join)。 方案 如果两个数据框里你想要匹配的列有不同的名...

  • Data.Frame()数据框操作

    Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同...

  • R语言中的数据框

    Data Frame一般被译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的...

网友评论

    本文标题:Manipulating Data - 数据框与列联表转换

    本文链接:https://www.haomeiwen.com/subject/hsuhvxtx.html