假设我有一个这样的数据框:
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, ]
但是当存在比Class
和Sex
更多的变量时,如果在一个窗口中选择所有变量,则单击多个菜单似乎很烦人。这可能在R
吗?
答案 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