【问题标题】:Divide each column of a dataframe by one row of the dataframe将数据帧的每一列除以数据帧的一行
【发布时间】:2020-05-22 22:16:51
【问题描述】:

我想将数据框的每一列除以一行的值。 我试图将我的数据框转换为矩阵并将数据​​框的一行提取为向量,然后将矩阵除以向量,但它不起作用。实际上,只有矩阵的第一行除以向量。

Here 是我的原始数据框。

这是我尝试运行的代码:

data <- read_excel("Documents/TFB/xlsx_geochimie/solfatara_maj.xlsx")
View(data)
data.mat <- as.matrix(data[,2:20])
vector <- data[12,2:20] 
data.mat/vector

【问题讨论】:

标签: r matrix


【解决方案1】:

将数据框 df 除以第三行:

df/df[rep(3, nrow(df)), ]

【讨论】:

    【解决方案2】:

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

    data.mat/unlist(vector)[col(data.mat)]
    #  FeO     Total S SO4 Total N      SiO2     Al2O3     Fe2O3        MnO        MgO        CaO       Na2O       K2O
    #[1,] 0.10  16.5555556  NA      NA 0.8908607 0.8987269 0.1835206 0.08333333 0.03680982 0.04175365 0.04823151 0.5738562
    #[2,] 0.40 125.8333333  NA      NA 0.5510204 0.4456019 0.2359551 0.08333333 0.04294479 0.01878914 0.04501608 0.2588235
    #[3,] 0.85   0.6111111  NA      NA 1.0021295 1.0162037 0.7715356 1.08333333 0.53987730 0.69728601 1.03858521 1.0457516
    #[4,] 0.15  48.0555556  NA      NA 1.1027507 0.2569444        NA 0.08333333 0.01840491 0.01878914 0.04180064 0.1647059
    #[5,] 0.85          NA  NA      NA 1.0889086 1.0271991 0.6591760 0.75000000 0.59509202 0.53862213 1.02250804 1.1228758
    #[6,]   NA          NA  NA      NA 1.3426797 0.6319444 0.0411985 0.08333333 0.03067485 0.11899791 0.65594855 0.7764706
    #          TiO2      P2O5        LOI       LOI2     Total   Total 2   Fe2O3(T)
    #[1,] 0.7924528 0.3928571  7.0841837  6.6963855 0.9922233 0.9894632 0.14489796
    #[2,] 0.5094340 0.3214286 14.5561224 13.7710843 0.9958126 0.9936382 0.31020408
    #[3,] 0.8679245 0.6428571  1.5637755  1.5228916 0.9990030 0.9970179 0.80612245
    #[4,] 1.4905660 0.2857143  7.4056122  7.0024096 0.9795613 0.9769384 0.05510204
    #[5,] 1.0377358 0.2500000  0.3520408  0.3783133 0.9969093 0.9960239 0.74489796
    #[6,] 0.3018868 0.2500000  1.2551020  1.1879518 1.0019940 1.0000000 0.04489796
    

    或使用sweep

    sweep(data.mat, MARGIN = 2, unlist(vector), FUN = `/`)
    

    或者使用mapplyasplit

    mapply(`/`, asplit(data.mat, 2), vector)
    

    数据

    data_mat <- structure(c(0.2, 0.8, 1.7, 0.3, 1.7, NA, 5.96, 45.3, 0.22, 17.3, 
    NA, NA, NA, 6.72, NA, 4.08, 0.06, 0.16, NA, NA, NA, NA, NA, NA, 
    50.2, 31.05, 56.47, 62.14, 61.36, 75.66, 15.53, 7.7, 17.56, 4.44, 
    17.75, 10.92, 0.49, 0.63, 2.06, NA, 1.76, 0.11, 0.01, 0.01, 0.13, 
    0.01, 0.09, 0.01, 0.06, 0.07, 0.88, 0.03, 0.97, 0.05, 0.2, 0.09, 
    3.34, 0.09, 2.58, 0.57, 0.15, 0.14, 3.23, 0.13, 3.18, 2.04, 4.39, 
    1.98, 8, 1.26, 8.59, 5.94, 0.42, 0.27, 0.46, 0.79, 0.55, 0.16, 
    0.11, 0.09, 0.18, 0.08, 0.07, 0.07, 27.77, 57.06, 6.13, 29.03, 
    1.38, 4.92, 27.79, 57.15, 6.32, 29.06, 1.57, 4.93, 99.52, 99.88, 
    100.2, 98.25, 99.99, 100.5, 99.54, 99.96, 100.3, 98.28, 100.2, 
    100.6, 0.71, 1.52, 3.95, 0.27, 3.65, 0.22), .Dim = c(6L, 19L), .Dimnames = list(
        NULL, c("FeO", "Total S", "SO4", "Total N", "SiO2", "Al2O3", 
        "Fe2O3", "MnO", "MgO", "CaO", "Na2O", "K2O", "TiO2", "P2O5", 
        "LOI", "LOI2", "Total", "Total 2", "Fe2O3(T)")))
    
    vector <- structure(list(FeO = 2, `Total S` = 0.36, SO4 = NA_real_, `Total N` = NA_real_, 
        SiO2 = 56.35, Al2O3 = 17.28, Fe2O3 = 2.67, MnO = 0.12, MgO = 1.63, 
        CaO = 4.79, Na2O = 3.11, K2O = 7.65, TiO2 = 0.53, P2O5 = 0.28, 
        LOI = 3.92, LOI2 = 4.15, Total = 100.3, `Total 2` = 100.6, 
        `Fe2O3(T)` = 4.9), row.names = c(NA, -1L), class = c("tbl_df", 
    "tbl", "data.frame"))
    

    【讨论】:

    • 感谢您的快速回答。执行第一个时,我得到:错误:必须在[ 中使用向量,而不是类矩阵的对象。对于扫描函数,我得到: FUN(x, aperm(array(STATS, dims[perm]), order(perm)), ...) 中的错误:二元运算符的非数字参数此外:警告消息:在sweep(data.mat, MARGIN = 2, vecteur, FUN = /) : 长度(STATS) 或dim(STATS) 不对应dim(x)[MARGIN]
    • @JeandeLéry 问题出在vector,它不是一个向量,因为您是从tbl_df 子集化的。我通过unlisting vector 更新了代码,然后复制
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 2018-12-02
    • 2013-11-18
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多