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吗?

4

2 回答 2

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"))
于 2013-05-12T23:55:37.097 回答
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的选项。如果你想采取meanof Score,你可以在同一步骤中完成

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


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

请注意,如果该选项不可用,则后者将给出一个NAforScore而前者将给出一个值mean==0

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

DT[AllVals[choice, ] ]
   Class Sex Score
1:     C   F    NA
于 2013-05-13T01:14:16.257 回答