2016-08-03 61 views
1

假设我有一个向量列名的列表:R:查找数据帧的列清单的最大/最小

vec=c("C1" , "C2" ,"C3"). 

我知道一个事实,即这些列名来自数据帧DF :

df: 

C1 C2 C3 C4 C5 
1 2 3 4 5 
1 4 3 5 6 
3 2 4 1 3 

如何找到vec中每列的最大值,查看它们在df中的值。例如,像:

boostedMax(vec, df, na.rm=T) 

显然是行不通的,但这个想法是,boostedMax需要列名的矢量和数据帧在列,并从这些列返回最大值。在这个例子中,它会返回矢量:

(3,4,4) 

在此先感谢!

+0

编辑,以提供一个例子数据帧。 –

+1

'sapply(df [vec],max,na.rm = T)' – Gregor

+0

提供示例数据时,最好将其复制/粘贴。你可以通过包含代码来创建数据框或通过发布'dput(df)'来实现。 – Gregor

回答

1
vec=c("C1" , "C2" ,"C3") 

C1 C2 C3 C4 C5 
1 2 3 4 5 
1 4 3 5 6 
3 2 4 1 3 

df <- read.table(con<-file("clipboard"), header = T) 
df 

apply(df[,vec],2,max) 
C1 C2 C3 
3 4 4 

for(i in vec){ 
    print(max(df[,i])) 
} 
[1] 3 
[1] 4 
[1] 4 

sapply(df[,vec],max) 
C1 C2 C3 
3 4 4 

如果你认为的vec一些水平可能不df你可以做df[,colnames(df) %in% vec]代替df[,vec]

+0

对于这个(Gregor的评论),'apply'比'sapply'糟糕,因为它可能会破坏排序,例如,如果你混合了char和num列。 – Frank

+1

嗯,事实证明我错了。我认为'apply'会把这个搞砸,但不知道它是什么:'DF = data.frame(a = c(2.2,11,1),b = c(“A”,“B”,“C” ));适用(DF,2,max)' – Frank

+0

@RajRaina很高兴听到它。如果你认为'vec'的某些级别可能不在'df'中,你可以在'%vec]中做'df [,colnames(df)%]'' –

1
df <- data.frame(a = c(1:4, NA), b = 6:10, c = 11:15) 
d <- colnames(df)[1:2] 
sapply(df[d], max, na.rm = TRUE) 
0
dat <- data.frame(a=c(1,2,3),b=c(2,3,4),c=c(3,4,5)) 
> dat 
    a b c 
1 1 2 3 
2 2 3 4 
3 3 4 5 

> sapply(dat, max, na.rm = TRUE) 
a b c 
3 4 5 
1

转换后,我们可以使用colMaxsmatrixStats数据集子集matrix

library(matrixStats) 
colMaxs(as.matrix(df[vec])) 
#[1] 3 4 4 

或者另一种选择是dplyr

library(dplyr) 
df %>% 
    summarise_each_(funs(max), vec) 
# C1 C2 C3 
#1 3 4 4