首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用r的计算从数据库中构造一个矩阵

用r的计算从数据库中构造一个矩阵
EN

Stack Overflow用户
提问于 2018-09-12 19:10:41
回答 2查看 110关注 0票数 1

我试图在R上解决以下问题。

我有一个看起来像这样的data.frame(显然要大得多):

代码语言:javascript
运行
复制
Column_1     Column_2     Column_3
(0-1]        (15-25]      58
(2-3]        (35-45]      25
(4-5]        (35-45]      50
(0-1]        (15-25]      5
(2-3]        (25-35]      10
(1-2]        (25-35]      15
(1-2]        (15-25]      12
(3-4]        (25-35]      10
(4-5]        (35-45]      9

目标是从这个data.frame构造一个矩阵,其中Column_1作为列名,Column_2作为行名,矩阵中和矩阵内部的每个值的平均值都与Column_1Column_2中的相应值相关联。

生成的矩阵应该如下所示:

代码语言:javascript
运行
复制
      (15-25]    (25-35]     (35-45]
(0-1]   31.5      0             0
(1-2]   12        15            0
(2-3]   0         10            25     
(3-4]   0         10            0
(4-5]   0         0             29.5

我怎么能做到呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-12 19:37:40

xtabs()aggregate()完成了以下工作:

代码语言:javascript
运行
复制
as.data.frame.matrix(xtabs(Column_3 ~ Column_1 + Column_2,
                           aggregate(Column_3 ~ Column_1 + Column_2, df, mean)))
# output
      (15-25] (25-35] (35-45]
(0-1]    31.5       0     0.0
(1-2]    12.0      15     0.0
(2-3]     0.0      10    25.0
(3-4]     0.0      10     0.0
(4-5]     0.0       0    29.5

# data
df <- structure(list(Column_1 = c("(0-1]", "(2-3]", "(4-5]", "(0-1]", 
"(2-3]", "(1-2]", "(1-2]", "(3-4]", "(4-5]"), Column_2 = c("(15-25]", 
"(35-45]", "(35-45]", "(15-25]", "(25-35]", "(25-35]", "(15-25]", 
"(25-35]", "(35-45]"), Column_3 = c(58L, 25L, 50L, 5L, 10L, 15L, 
12L, 10L, 9L)), .Names = c("Column_1", "Column_2", "Column_3"
), class = "data.frame", row.names = c(NA, -9L))
票数 1
EN

Stack Overflow用户

发布于 2018-09-12 19:49:35

我们可以使用来自dcastreshape2。调用数据dd

代码语言:javascript
运行
复制
wide = reshape2::dcast(data = dd, Column_1 ~ Column_2, fun.aggregate = mean, fill = 0)
wide
#   Column_1 (15-25] (25-35] (35-45]
# 1    (0-1]    31.5       0     0.0
# 2    (1-2]    12.0      15     0.0
# 3    (2-3]     0.0      10    25.0
# 4    (3-4]     0.0      10     0.0
# 5    (4-5]     0.0       0    29.5

这是一个数据框架,我们当然可以转换为矩阵:

代码语言:javascript
运行
复制
mat = as.matrix(wide[, -1])
row.names(mat) = wide[, 1]
mat
#       (15-25] (25-35] (35-45]
# (0-1]    31.5       0     0.0
# (1-2]    12.0      15     0.0
# (2-3]     0.0      10    25.0
# (3-4]     0.0      10     0.0
# (4-5]     0.0       0    29.5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52301897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档