首页 > 解决方案 > 如何用不同的数字划分每一列

问题描述

我使用R的“table”函数对数据进行汇总,得到如下结果:

汇总数据

在此处输入图像描述

现在,我想将第一列中的所有数字除以 32,将第二列中的所有数字除以 51,将第三列中的所有数字除以 54。然后这些数字将形成一个新的 3*5 矩阵,并且我将使用新矩阵继续绘制条形图。

这里有人知道我如何在 R 中编写命令吗?

标签: r

解决方案


我们可以使用col复制vector值以使长度相同,然后进行除法

out/c(32, 51, 54)[col(out)]

或者只是转置输出,进行除法和转置

t(t(out)/c(32, 51, 54))

如果我们举一个可重现的例子

df1 <- mtcars[1:3, 1:3]

col(df1) # gives the column index
#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]    1    2    3
#[3,]    1    2    3

R中,索引从 1 开始。由于这些索引是重复的,当我们传递vector等于总列数的值时,每个值都会被复制

v1 <- c(32, 51, 54)
v1[col(df1)]
#[1] 32 32 32 51 51 51 54 54 54

现在长度相同

df1/v1[col(df1)]
#                  mpg        cyl     disp
#Mazda RX4     0.65625 0.11764706 2.962963
#Mazda RX4 Wag 0.65625 0.11764706 2.962963
#Datsun 710    0.71250 0.07843137 2.000000

通过单独划分检查输出

df1[,1]/32
#[1] 0.65625 0.65625 0.71250

对于第二种解决方案,通过执行转t置,我们利用了回收

t(df1)/v1
#     Mazda RX4 Mazda RX4 Wag Datsun 710
#mpg  0.6562500     0.6562500 0.71250000
#cyl  0.1176471     0.1176471 0.07843137
#disp 2.9629630     2.9629630 2.00000000

随着输出被转置,我们进行第二次转置t以获得原始数据结构


推荐阅读