2016-08-03 108 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