R 单个菜单的多个输出

R 单个菜单的多个输出,r,menu,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 我想要一个单一的菜单,选择班级和性别,得到平均值。现在在我的真实数据框中,我

假设我有这样一个数据帧:

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, ]

i这可以修改,但基本思想是创建显示的所有选项的交叉点,只需使用一个菜单即可

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],]

dat如果您使用
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")

请注意,如果该选项不可用,后者将给出
得分
NA
,而前者将给出
平均值==0


在一个基本的层次上,你可以生成一个包含你的类和性别的所有组合的向量,比如“am”、“af”、“bm”、“bf”,并将其显示在菜单中。否则,您可能必须使用包gWidgets或tcltk构建各种gui(如果您希望更多的UI可以从浏览器中使用,比如说,您可以尝试shiny)。我很欣赏这种解决方案,但当变量超过3个或变量不只是单个字符时,它会变得非常丑陋和冗长。在我看来,我有一个单独的窗口,同时独立地包含所有菜单(即单个滚动条、单个标题),但有一个确定按钮(!)。我需要使用哪个软件包
数据。表
?对不起,
,我应该把它放在那里。包本身也称为
data.table
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")
# take the mean of all the selected rows
DT[AllVals[choice,],  mean(Score) ]$V1


# or just select all Rows
DT[AllVals[choice,] ]
DT[AllVals[choice,],  mean(Score) ]$V1
[1] 0

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