【问题标题】:How to select certain rows of a data set in R to then use in a function?如何在 R 中选择数据集的某些行然后在函数中使用?
【发布时间】:2020-09-24 09:23:34
【问题描述】:

我正在尝试在 R 中的 iris 数据集中找到不同物种之间的马氏距离。我能够通过以下代码找到 setosa 和 versicolor 之间的距离:

library(HDMD)

#To get Mahalanobis distances between Setosa and Versicolor,
set.vers<-pairwise.mahalanobis(x=iris[1:100,1:4], grouping=iris[1:100,]$Species)
md= sqrt(set.vers$distance)

但是,我正在努力为 setosa 和 virginica 做同样的事情。我不确定如何选择数据集的前 50 行和后 50 行(即没有任何 versicolor 数据)

【问题讨论】:

    标签: r cluster-analysis iris-dataset


    【解决方案1】:

    这是一个基本的子集问题。您想基于Species 进行子集化,类似于(未测试)

    ss <- iris[iris$Species %in% c("Setosa", "Virginica"), ]
    pairwise.mahalanobis(x = ss, grouping = ss$Species)
    

    您当然可以通过多种方式更改要比较的物种对。

    【讨论】:

    • 当我使用它时,表示 ss 有 0 行。出现以下错误'[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species (or 0-length row.names)'
    • @daisybeats 错误来自"Setosa" 和"Virginica" 中的大写字母。更正后,在第二行中它必须是 x = ss[-5] 或 x = ss[1:4]。而grouping = droplevels(ss$Species) 将避免警告消息。
    • @RuiBarradas 你是对的,计算非数字 Species 列上的距离有点困难。
    【解决方案2】:

    这是一种获取iris$Species 和combn 中所有级别组合并计算马氏距离的方法。

    library(HDMD)
    
    inx <- sapply(levels(iris$Species), function(l) which(iris$Species == l), simplify = FALSE)
    inx <- combn(inx, 2, function(x) unlist(x), simplify = FALSE)
    set.vers_all <- lapply(inx, function(i) {
      pairwise.mahalanobis(x = iris[i, 1:4], grouping = droplevels(iris$Species[i]))
    })
    set.vers_all
    

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多