【问题标题】:convert a data frame into a specifically formatted frequency table将数据帧转换为特定格式的频率表
【发布时间】:2012-03-15 20:56:15
【问题描述】:

我有一个 data.frame,我正在尝试创建一个频率表来显示每行值的频率。所以我从这样的事情开始:

d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))

看起来像这样:

  a b c
  1 3 1
  2 4 2
  3 5 5

我真正想要创建的是一个如下所示的应急 data.frame 或矩阵:

1, 2, 3, 4, 5, 6, 7, 8, 9
2, 0, 1, 0, 0, 0, 0, 0, 0
0, 2, 0, 1, 0, 0, 0, 0, 0
0, 0, 1, 0, 2, 0, 0, 0, 0

顶行只是一个标签行,不需要在最终结果中。但我把它加在那里是为了说明。每行显示数字 1:9 以及每个数字在起始数据的每一行中出现的次数。

我想不出一个简单的方法来创建它。虽然看起来table() 功能应该很有帮助,但我无法得到它给我任何爱。任何帮助或想法表示赞赏。

【问题讨论】:

  • 你有一个充满数字的data.frame?蚱蜢,你忘记的速度有多快……使用矩阵。
  • 使用矩阵会改变答案吗?
  • 它不会改变 Josh O'Brien 的回答,因为 apply 会自动将其第一个参数转换为矩阵/数组。我不确定伊利亚的情况。反正我主要是在取笑。 ;-)
  • 我知道你在开玩笑,但这确实让我想知道......

标签: r


【解决方案1】:

给你:

t(apply(d, 1, tabulate, nbin=9))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    2    0    1    0    0    0    0    0    0
[2,]    0    2    0    1    0    0    0    0    0
[3,]    0    0    1    0    2    0    0    0    0

(尽管在此应用程序中可能无关紧要,tabulate()(在 table() 的代码中使用)也因其执行计算的速度令人印象深刻。)


编辑tabulate() 未设置为处理 0 或负整数。如果你想要另一个班轮,你可以使用table(),做这样的事情:

d <- data.frame(a=c(0,-1,-2), b=c(3,4,5), c=c(1,2,5))

t(apply(d, 1, function(X) table(c(X, -9:9)) - 1))
     -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
[1,]  0  0  0  0  0  0  0  0  0 1 1 0 1 0 0 0 0 0 0
[2,]  0  0  0  0  0  0  0  0  1 0 0 1 0 1 0 0 0 0 0
[3,]  0  0  0  0  0  0  0  1  0 0 0 0 0 0 2 0 0 0 0

【讨论】:

  • 绝对是(另一个)基础 R 的简单宝石之一。再次感谢 R-core!
  • 有什么办法让它适应零值和负值?在检查了我的用例后,这些比我做这个简单问题时意识到的更重要。
  • @JDLong -- 我使用table() 添加了一个单行代码,可以优雅地处理零和负整数。您只需要调整-9:9 位以涵盖您感兴趣的任何范围,并且该范围之外的任何数字仍将包含在表中。通过添加一些初步行来检查原始 data.frame 中的整数范围并在输出表中设置范围,您可以轻松地将其包装成一个不错的小函数来执行您想要的操作。干杯。
【解决方案2】:

另一种使用表格的解决方案

library(reshape)
d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))
d2 <- melt(d)
d2$rows <- rep(1:nrow(d), ncol(d))
table(d2$rows, d2$value)

【讨论】:

  • 这具有正确处理零和负值的明显优势,这将是我接下来的问题。非常好!
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 2020-12-09
  • 2019-11-18
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多