【问题标题】:R - Find percentiles of all the features for 1 of the observations from a dataset (Boston Housing Dataset)R - 从数据集(波士顿住房数据集)中查找 1 个观测值的所有特征的百分位数
【发布时间】:2020-09-02 02:53:10
【问题描述】:

我正在研究波士顿住房数据集。我过滤了具有最低“medv”的观测值(城镇),并在转换到新的数据帧后保存了它们。我想在这个新数据框中插入列,其中包含基于这些过滤观察的特征值的原始数据的百分位数。 这是 R 代码:

# load the library containing the dataset
library(MASS)

# save the data with custom name
boston = Boston

# suburb with lowest medv
low.medv = data.frame(t(boston[boston$medv == min(boston$medv),]))
low.medv

# The values I want populated in new columns:

# Finding percentile rank for crim
ecdf(boston$crim)(38.3518)
# >>> 0.9881423
ecdf(boston$crim)(67.9208)
# >>> 0.9960474

# percentile rank for lstat
ecdf(boston$lstat)(30.59)
# >>> 0.9782609
ecdf(boston$lstat)(22.98)
# >>> 0.8992095

期望的输出:

有没有办法在 sapply 中使用 ecdf 函数?

【问题讨论】:

    标签: r dataframe vectorization percentile


    【解决方案1】:

    我认为如果您不事先转置数据会更容易:

    low.medv <- boston[boston$medv == min(boston$medv),]
    res <- mapply(function(x, y) ecdf(x)(y), boston, low.medv)
    res
    #       crim     zn  indus   chas    nox      rm age     dis rad
    #[1,] 0.9881 0.7352 0.8874 0.9308 0.8577 0.07708   1 0.05731   1
    #[2,] 0.9960 0.7352 0.8874 0.9308 0.8577 0.13636   1 0.04150   1
    #        tax ptratio  black  lstat     medv
    #[1,] 0.9901  0.8893 1.0000 0.9783 0.003953
    #[2,] 0.9901  0.8893 0.3498 0.8992 0.003953
    

    现在,如果您想要 4 列中显示的结果,您可以这样做:

    cbind(t(low.medv), t(res))
    

    【讨论】:

    • 谢谢。有效。你能解释一下mapply是如何进行的吗?我不熟悉那个功能。
    • mapply/Map 在第一次迭代中的数据帧含义上按列工作,boston 的第一列是 x,low.medv 的第一列是 y,在第二次迭代它传递函数中数据框的第二列,以此类推。
    • 另外,为什么有些人喜欢使用
    • 两者没有太大区别。这更像是他们多年来开发的一种编码风格。您可以查看此帖子以进行详细讨论stackoverflow.com/questions/1741820/…
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2020-05-24
    • 2019-01-10
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多