繁体   English   中英

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

[英]I want to generate combinations of 5 names from a column in an R data frame, whose values in a different column add up to a certain number or less

我有一个4列的数据框(UFC)。

第1栏(UFC $ Name)是本周末战斗的UFC战斗机的名称。

第2栏(UFC $ Salary)是他们在幻想体育比赛中“花费”的金额。

第3栏(UFC $ WinPct)是战斗机赢得战斗的可能性。

第4栏(UFC $ FinishPct)是战斗机在不做出决定的情况下赢得战斗的可能性。

我想制作一个数据框,其中包含全部(或更确切地说,它们的前X个,根据我在下一段中提到的参数)第1列中5架战斗机的组合,第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排名

好吧,这并不会很快,但这是一个主意...

## 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM