我想从R数据框架中的一列中生成5个名称的组合,其中不同列中的值加起来一定数量或更少

时间:2015-09-24 01:01:59

标签: r dataframe

我有一个包含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

排名

1 个答案:

答案 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))