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