【问题标题】:How can I create a function that creates a matrix using values from my dataset in R?如何创建一个使用 R 中数据集中的值创建矩阵的函数?
【发布时间】:2019-11-05 14:27:35
【问题描述】:

我有一个数据集,其中包含 6 个变量的 120 个观察值。五个变量是因素,1个变量是我的目标变量。 我需要编写一个函数来创建一个矩阵(对于每个因子),其中包含因子的每个级别作为列,目标变量的最大值作为第一行,目标变量的最小值作为第二行.

我知道如何创建矩阵,但是当我需要通过函数创建矩阵时我会迷路。 有人可以帮忙吗?

这是一个简单的例子,说明我想用一个虚构的简单数据集达到什么目的。 Example

如您所见,对于因子的每个级别(图片上的因子1),我想指示目标的最高值,以及目标的最低值。

这是我自己数据的一个子集:

 > dput(data_plu[1:4, ])
    structure(list(NaNO3 = structure(c(2L, 8L, 8L, 3L), .Label = c("10", 
    "14", "18", "2", "22", "26", "30", "6"), class = "factor"), 
CaCl2 = structure(c(4L, 
    8L, 8L, 8L), .Label = c("0.1", "0.28", "0.46", "0.64", "0.82", 
    "1", "1.19", "1.37"), class = "factor"), PO4 = structure(c(1L, 
    5L, 5L, 6L), .Label = c("0.1", "0.8", "1.5", "2.2", "2.9", "3.6", 
    "4.3", "5"), class = "factor"), NH4Cl = structure(c(5L, 3L, 3L, 
    6L), .Label = c("0.5", "10.86", "12.93", "15", "2.58", "4.65", 
    "6.72", "8.79"), class = "factor"), MgSO4 = structure(c(4L, 7L, 
    1L, 7L), .Label = c("0.21", "0.35", "0.5", "0.64", "0.79", "0.93", 
    "1.08", "1.22"), class = "factor"), DC = c(15000L, 707500L, 720000L, 
    872500L)), row.names = c(NA, 4L), class = "data.frame")

【问题讨论】:

  • 请分享一点样本数据。我认为model.matrix 函数可以让你大部分时间到达那里---see this question or others about one-hot encoding---但是当你谈到想要两行时,我有点困惑,一个是最大值,一个是最小值。你不是有 120 个观察值吗?
  • 对不起,如果我的问题不清楚。我在我的问题中添加了一张图片,以通过一个更简单的示例来说明我的意思。
  • 嗨莎拉,最好不是图片。你提到你现在知道创建一个矩阵,如果你用它来创建你的数据的一个小例子,是否有可能?
  • 啊 - 无视我的 cmets 关于 model.matrix 和 one-hot 编码,我完全误解了。请see the FAQ 提供可重现的示例。 dput() 是一个很好的函数来创建数据的复制/粘贴版本,例如 dput(your_data[1:4, ]) 将给我们您数据的前 4 行。
  • 我在我的问题中添加了一部分数据:)

标签: r function


【解决方案1】:

您可以修改它以满足您的需要。我编写了一个函数来处理一个因素,然后使用lapply 来处理它们。我已将您的示例数据称为dta

stats <- function(x, y) {
    minmax <- aggregate(y, list(x), range)
    cols <- minmax[, 1]
    result <- as.matrix(t(minmax[, -1]))
    dimnames(result) <- list(c("Min", "Max"), Levels=as.character(cols))
    return(result)
}
out <- lapply(dta[, -6], function(x) stats(x, dta$DC))
head(out, 1)
# $NaNO3
#      Levels
#          14     18      6
#   Min 15000 872500 707500
#   Max 15000 872500 720000

【讨论】:

  • 谢谢!我首先尝试了其他方法。似乎一个小细节还没有工作。但我会查看您的解决方案并尝试以这种方式找到我的错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2016-01-20
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多