2016-08-03 3 views
1

나는 벡터로 열 이름의 목록이 있다고 가정R : 데이터 프레임의 열 목록의 최대/최소 찾기

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

나는이 열 이름 데이터 프레임 안양에서 온 것을 아는 사실을 :

df: 

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

각 열의 최대 값을 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에 있지 않을 수 있다고 생각하면 우리는 변환 후 matrixStats에서 colMaxs을 사용할 수 있습니다 대신 df[,vec]

+0

'apply'는이 (Gregor의 설명)에 비해'sapply'보다 나쁩니다. 예를 들어, char와 num 열이 섞인 경우 정렬이 손상 될 수 있습니다. – Frank

+1

흠, 어쨌든 나는 틀렸어. 나는'apply'가 이것을 망쳐 놓을 것이라고 생각했지만 어떻게 든 그것은하지 않는다 :'DF = data.frame (a = c (2.2, 11, 1), b = c ("A", "B", "C")); 적용 (DF, 2, 최대) ' – Frank

+0

@ RajRaina 듣기 좋다. 'vec'의 일부 레벨이'df'에 없을 수도 있다고 생각한다면'df [, % colc %] '를 할 수 있습니다. –

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

df[,colnames(df) %in% vec]을 수행 할 수 있습니다 데이터 세트의 하위 집합을 matrix

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

가 아니면 또 다른 옵션은 예 dataframe을 제공하기 위해 dplyr

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