【问题标题】:max or min per column by factor每列的最大值或最小值(按因子)
【发布时间】:2017-03-17 17:14:02
【问题描述】:

我有一个包含 n 列的数据框 A。我需要通过因子 B 找到每列的最大值(但当其他值小于 0 时不是 0)。

数据框(A)

B   a    b
1   0    0
2   0    0
3   0    0
1  -0.1 0.1
2   0.2-0.3
3   0   1
1  -0.3 0.4
2  -0.5 0.2
3   0.1 0.2

我正在寻找的输出看起来像这样

B  a     b
1  -0.3  0.4
2  0.2   0.2
3  0.1   1

我知道我可以使用aggregate 函数,但它一次只能用于一列。
每列的算法是:
1.忽略所有0
2. 如果所有值

【问题讨论】:

  • 您可以使用*apply 函数在所有列上使用聚合?
  • 是的,但是当另外两个为负数时,它取 0 作为最大值。但在这种情况下,我需要取最大负值
  • 但是对于第 1 组,您选择 -0.3。不应该是-0.1吗?
  • @Sotos,对不起,我错误地表达了所需的输出,它应该包括三个中的最低/最高值
  • ... 如果某个特定分组值的所有值都是 0?

标签: r


【解决方案1】:

这里是一个基于 R 的解决方案:

f1 <- function(x) { x1 <- x[x!=0]; if(all(x1<0)) min(x1) else max(x1) }
aggregate(cbind(a,b) ~ B, data=A, FUN=f1)

(函数f1()取自@akrun的答案)
结果:

#> aggregate(cbind(a,b) ~ B, data=A, FUN=f1)
#  B    a   b
#1 1 -0.3 0.4
#2 2  0.2 0.2
#3 3  0.1 1.0

数据:

A <- structure(list(B = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), a = c(0, 
0, 0, -0.1, 0.2, 0, -0.3, -0.5, 0.1), b = c(0, 0, 0, 0.1, -0.3, 
 1, 0.4, 0.2, 0.2)), .Names = c("B", "a", "b"), class = "data.frame", 
row.names = c(NA, -9L))

【讨论】:

    【解决方案2】:

    我们可以试试data.table

    library(data.table)
    f1 <- function(x) {x1 <- x[x!=0];
                       if(all(x1<0)) min(x1) else max(x1)}
    setDT(A)[, lapply(.SD, f1), by = B]
    #   B    a   b
    #1: 1 -0.3 0.4
    #2: 2  0.2 0.2
    #3: 3  0.1 1.0
    

    dplyr

    library(dplyr)
    A %>% 
        group_by(B) %>% 
        summarise_each(funs(f1))
    # A tibble: 3 × 3
    #      B     a     b
    #   <int> <dbl> <dbl>
    #1     1  -0.3   0.4
    #2     2   0.2   0.2
    #3     3   0.1   1.0
    

    数据

    A <- structure(list(B = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), a = c(0, 
    0, 0, -0.1, 0.2, 0, -0.3, -0.5, 0.1), b = c(0, 0, 0, 0.1, -0.3, 
     1, 0.4, 0.2, 0.2)), .Names = c("B", "a", "b"), class = "data.frame", 
    row.names = c(NA, -9L))
    

    【讨论】:

    • 谢谢@akrun,它给出了一个错误missing value where TRUE/FALSE needed
    • @ThePooh 我没有发现您的示例数据有任何错误。用我使用的数据更新
    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多