系数

时间:2017-03-17 08:04:58

标签: r

我有一个包含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.如果所有值<0,则取值的最小值,否则取最大值

2 个答案:

答案 0 :(得分:5)

以下是基础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))

答案 1 :(得分:4)

我们可以尝试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))