2013-05-12 2 views
3

내가이 같은 데이터 프레임 있다고 가정하자 :다중 출력

Class Sex Score 
A  M 90 
A  F 90 
A  F 85 
A  M 85 
A  M 80 
A  M 70 
A  F 70 
A  M 60 
B  F 90 
B  M 90 
B  M 75 
B  F 70 

을 나는 클래스와 성별을 선택하고 평균을 얻는 하나의 메뉴를합니다. 지금 내 실제 데이터 프레임에 나는 두 메뉴

i <- menu(c("A","B"), graphics=TRUE, title="Choose class") 
j <- menu(c("M","F"), graphics=TRUE, title="Choose sex") 
df.1 <- df.1[df.1$Class==i, ] 
df.1 <- df.1[df.1$Sex==j, ] 

그러나보다 더 많은 변수가있을 때 단지 ClassSex은 그들이 모두 하나 개의 창에서 선택 될 수있을 때 여러 메뉴를 클릭 성가신 것을 사용하고 있습니다. 이 가능합니까 R?

+2

의 값을 줄 것이다 "AF", "BM", "BF"와 DIS 이것을 메뉴에서 재생하십시오. 그렇지 않으면, 당신은 아마 GUI를 사용하여 일종의 GUI를 빌드해야합니다. 패키지 gWidgets 또는 tcltk (브라우저에서 사용할 수있는 UI를 더 많이 사용하고 싶다면 반짝이라고 할 수 있습니다.) –

답변

2

이것은 수정할 수 있지만 기본적인 아이디어는 표시되는 모든 옵션의 교차점을 만들고 단일 메뉴 만 사용하는 것입니다. 여기

dat <- read.table(textConnection("Class Sex Score 
A  M 90 
A  F 90 
A  F 85 
A  M 85 
A  M 80 
A  M 70 
A  F 70 
A  M 60 
B  F 90 
B  M 90 
B  M 75 
B  F 70 
"), header = TRUE) 

vals <- interaction(dat$Class, dat$Sex) 
opts <- as.character(unique(vals)) 
choice <- menu(opts, graphics = TRUE, title = "Choose Class.Sex") 
dat[vals == opts[choice],] 

는 당신에게 당신이 열 컬렉션으로 키를 설정할 수있는 장점 을 제공합니다 당신이 data.table 대신 data.frame으로 사용하는 경우 함수

# data - dataset to subset 
# cols - either character vector with names of the columns 
#  or numeric vector with column numbers 
# graphics - logical. Should the menu be graphical? 
subsetMenu <- function(data, cols, graphics = TRUE){ 
    if(is.numeric(cols)){ 
     colnames <- colnames(data)[cols] 
    }else{ 
     colnames <- cols 
    } 

    vals <- interaction(data[,cols]) 
    opts <- as.character(unique(vals)) 
    title <- paste("Choose", paste0(colnames, collapse = ".")) 

    choice <- menu(opts, graphics = graphics, title = title) 
    data[vals == opts[choice],] 
} 

df1 <- subsetMenu(dat, c("Class", "Sex"), graphics = T) 
df2 <- subsetMenu(dat, c("Class", "Sex"), graphics = F) 
df3 <- subsetMenu(dat, 1:2) 
df4 <- subsetMetu(mtcars, c("cyl", "gear")) 
+0

이 솔루션을 고맙게 생각하지만 3 개 이상의 변수가 있거나 매우 길면 추악하고 길어집니다. 변수는 단일 문자가 아닙니다. 내 마음 속에는 모든 메뉴가 동시에 독립적으로 (즉, 개별 스크롤 막대, 개별 제목) 하나의 OK 버튼 (!)이있는 단일 창이 있습니다. – Hugh

0

에 싸서 그 생각입니다 당신은 메뉴 옵션으로 제공하고 싶습니다. 선택이 이루어질 때

그런 다음, 당신은 단순히 그 값을 전달, 당신은 여기에

을 선택하여 적절한 모든 행 세분화 예이며,이 : 한 번, 그리고

libary(data.table) 

# choose which columns are to be selected from 
keyCols <- c("Class", "Sex") 

# crate the data.table form teh data.frame 
DT <- data.table(dat, key=keyCols) 

# grab all combinations of the unique values of the columns 
AllVals <- DT[, do.call(expand.grid, lapply(.SD, unique)), .SDcols=keyCols] 

# create an options string for the menu 
opts <- apply(AllVals, 1, paste, collapse=", ") 

# Menu 
choice <- menu(opts, graphics = TRUE, title = "Choose Class.Sex") 

옵션이 선택되면 해당 선택 항목으로 DT의 색인을 생성 할 수 있습니다. 당신이 meanScore의 수행하려면 , 같은 단계에서 옵션을 사용할 수없는 경우, 후자가 전자 동안 Score에 대한 NA을 줄 것이다

# take the mean of all the selected rows 
DT[AllVals[choice,], mean(Score) ]$V1 


# or just select all Rows 
DT[AllVals[choice,] ] 

참고 그것을 할 수 있습니다 당신은 "AM"처럼 클래스와 성별의 모든 조합을 가진 벡터를 생성 할 수있는 기본적인 수준에서 mean==0

DT[AllVals[choice,], mean(Score) ]$V1 
[1] 0 

DT[AllVals[choice, ] ] 
    Class Sex Score 
1:  C F NA 
+0

'data.table'을 사용해야하는 패키지는 무엇입니까? – Hugh

+0

미안, '휴', 내가 거기에 넣었어야 했어. 패키지 자체를'data.table'라고 부릅니다. –