我有一个包含4列的数据框(UFC)。
第1栏(UFC $ Name)是本周末战斗的UFC战士的名字。
第2栏(UFC $ Salary)是他们花费多少"成本"在幻想体育比赛中。
第3列(UFC $ WinPct)是战斗机赢得战斗的可能性。
第4列(UFC $ FinishPct)是战斗机在没有做出决定的情况下赢得战斗的可能性。
我想制作一个数据框,其中包含来自第1列的5架战斗机的所有(或更实际上基于我在下一段中提到的参数的前X个数字) 2笔金额合计不超过50,000美元。
然后我真正感兴趣的是5名战士的组合,他们的第4列总和最高。
我在数据框架的低水平修补方面做得相当不错,但这对我来说有点太高级,无法绕过如何接近。
这是大约30%的数据帧。
Name Salary WinPct FinishPct
Keita Nakamura 9100 31.00 15.36
George Roop 8900 33.00 15.76
Teruto Ishihara 9000 33.00 17.08
Naoyuki Kotani 8700 30.50 18.35
Yusuke Kasuya 8500 29.60 21.16
Katsunori Kikuno 8800 33.66 21.88
所需的输出看起来像这样:
Lineup
Roy Nelson,Gegard Mousasui,Yusuke Kasuya,George Roop,Diego Brandao
SalarySum
47900
FinishPctSum
148.99
它将返回那些输出的前X个数,按最高的FinishPctSum
排名答案 0 :(得分:1)
这不会非常快,但这只是一个想法......
## make a list of all combinations of 5 of Name, Salary, and FinishPct
xx <- with(df, lapply(list(as.character(Name), Salary, FinishPct), combn, 5))
## convert the names to a string,
## find the column sums of the others,
## set the names
yy <- setNames(
lapply(xx, function(x) {
if(typeof(x) == "character") apply(x, 2, toString) else colSums(x)
}),
names(df)[c(1, 2, 4)]
)
## coerce to data.frame
newdf <- as.data.frame(yy)
导致
# Names Salary FinishPct
# 1 Keita Nakamura, George Roop, Teruto Ishihara, Naoyuki Kotani, Yusuke Kasuya 44200 87.71
# 2 Keita Nakamura, George Roop, Teruto Ishihara, Naoyuki Kotani, Katsunori Kikuno 44500 88.43
# 3 Keita Nakamura, George Roop, Teruto Ishihara, Yusuke Kasuya, Katsunori Kikuno 44300 91.24
# 4 Keita Nakamura, George Roop, Naoyuki Kotani, Yusuke Kasuya, Katsunori Kikuno 44000 92.51
# 5 Keita Nakamura, Teruto Ishihara, Naoyuki Kotani, Yusuke Kasuya, Katsunori Kikuno 44100 93.83
# 6 George Roop, Teruto Ishihara, Naoyuki Kotani, Yusuke Kasuya, Katsunori Kikuno 43900 94.23
未执行任何检查以确定工资是否低于50k。它只给出了5架战斗机的所有组合及其各自的总和。你可以通过子集来找到小于50k的工资
newdf[newdf$Salary <= 5e4, ]
请注意,5e4
是50,000的简写/科学记数法。
数据:强>
df <- structure(list(Name = structure(c(3L, 1L, 5L, 4L, 6L, 2L), .Label = c("George Roop",
"Katsunori Kikuno", "Keita Nakamura", "Naoyuki Kotani", "Teruto Ishihara",
"Yusuke Kasuya"), class = "factor"), Salary = c(9100L, 8900L,
9000L, 8700L, 8500L, 8800L), WinPct = c(31, 33, 33, 30.5, 29.6,
33.66), FinishPct = c(15.36, 15.76, 17.08, 18.35, 21.16, 21.88
)), .Names = c("Name", "Salary", "WinPct", "FinishPct"), class = "data.frame", row.names = c(NA,
-6L))