【问题标题】:Find the maximum in a row of a DataFrame在 DataFrame 的一行中找到最大值
【发布时间】:2011-12-07 13:34:43
【问题描述】:

这是the question presented for matrix before 的变体。

我需要逐行查找数据框的第一个、第二个、...最大值和 将每一个存储在一个单独的新列中。

我需要构建的函数应该是这样的:

> set.seed(1)
> v1 <- runif(10,1,10)
> v2 <- runif(10,1,10)
> v3 <- runif(10,1,10)
> Dt <- datal.frame( v1, v2, v3 )
> head(Dt, 3)
     v1    v2    v3
1 3.390 2.854 9.412
2 4.349 2.589 2.909
3 6.155 7.183 6.865
> label <- big(Dt, pos=1)
#### # big a function to find the first, second, .... (pos) biggets value and returns its label
> label
[1] "v3" "v1" "v2" ...
> big(Dt, pos=2)
[1] "v1" "v3" "v3" ...

谢谢。 娟

【问题讨论】:

  • 认为这需要更多解释。结果在这里多久?它的长度是否为 10,与矩阵的行相同(您在这里制作了一个矩阵,而不是数据框,因此也需要调整)。你能用实际数字做一个例子吗(如果你想要可重现的随机数,请使用 set.seed(310366) )并向我们展示答案应该是什么。哦,“第一、第二”是指“最小的、次小的”?
  • 这个问题没有明确表述。您的标题与第二段有所不同。请使其保持一致并清楚地制定您想要的内容(逐行或总体最大值......)
  • @Spacedman,你是对的。我的文字很混乱。我需要变量的标签。抱歉,我应该使用 cbind 的 data.frame 函数。我正在查看前 1 或 2 个最大数字的列表。
  • @Thomas 我的英语有严重问题。但也与 R. 也许我的最后一句话应该被删除。你不觉得吗?我的问题是逐行的,而不是整体的。如果需要,结果应该可以作为另一个变量存储在同一数据框中。

标签: r function


【解决方案1】:

正如@Spacedman 提到的,您应该提供更多详细信息。因此,无论此答案是否有帮助,请尝试重新构建您的问题。

我猜你有一个 data.frame/matrix 并且你想为每一行提取第 n 个最大值。

##Set up some dummy data
R> set.seed(1)
R> v1 <- runif(10,1,10); v2 <- runif(10,1,10)
R> v3 <- runif(10,1,10); Dt <- data.frame( v1, v2, v3 )
R> head(Dt, 2)
     v1    v2    v3
1 3.390 2.854 9.412
2 4.349 2.589 2.909

##Step 1: Use "apply" and "order" to order rows
##Step 2: Use subsetting to extract a particular value
R> big = function(Dt, pos=1) {
+    ordered_rows <- apply(Dt, 1, order, decreasing = TRUE)
+    positions <- rep(colnames(Dt), nrow(Dt))[as.vector(ordered_rows[pos,])]
+    return(positions)
+  }
R> big(Dt, 3)
 [1] "v2" "v2" "v1" "v3" "v1" "v3" "v3" "v3" "v2" "v1"
R> big(Dt, 1)
 [1] "v3" "v1" "v2" "v1" "v2" "v1" "v1" "v2" "v3" "v2" 

【讨论】:

  • 你明白我的意思!这或多或少是我需要生成的代码。只有,我需要排序位置中最大的。在您的代码中,第一个结果应该是 [1] "v3" "v1" ...。如果我运行 big(Dt,1)。但是你的功能很好。我认为它应该被称为小。如果我运行 big(Dt,2),那么结果应该是: [1] "v1" "v3" 对应于数据集中的第二大位置。谢谢你。我将探索以逆序排序的选项。
  • 通过我所做的修改,仍然有错误。只有第一个标签是错误的,其余的都是好的。第二大位置也是同样的错误。
  • 您之前的代码几乎是正确的,只是索引指向错误。而且这段代码也是正确的。只是它更长。你以前的代码应该是这样来解决我的问题的:' big = function(Dt, pos=1) { ordered_rows
  • 当我们使用 10000 条记录时,您的第二个代码比第一个代码慢 70%。我这样测试:'set.seed(1) v1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多