我有一个包含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,则取值的最小值,否则取最大值
答案 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))