单个菜单的多个输出

时间:2013-05-12 23:29:59

标签: r menu

假设我有一个这样的数据框:

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 个答案:

答案 0 :(得分: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 - 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"))

答案 1 :(得分:0)

如果您使用data.table代替data.frame,它会为您提供优势 您可以将该键设置为要作为菜单选项提供的列的集合。

然后,当进行选择时,您只需传入该值,并选择所有相应的行

这是一个例子,细分:

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。 如果您想采用mean的{​​{1}},可以在同一步骤中执行此操作

Score

请注意,如果该选项不可用,后者将为# take the mean of all the selected rows DT[AllVals[choice,], mean(Score) ]$V1 # or just select all Rows DT[AllVals[choice,] ] 提供NA,而前者的值为Score

mean==0