使用FOR循环从R中填充数据(代码审查)

时间:2018-12-28 19:34:51

标签: r dataframe for-loop

所以我的目标是用值填充数据框的最后一列。数据帧为[343,8]。我为此写了一个解决方案,但是它不起作用,我很好奇为什么我的想法行不通:

result = vector(length = 3)

for(i in 1:343){
  for(j in 1:3){
    result[j] = combos[i:j]
  }
  combos$prize[i] = score(result)
}

较大数据框的名称为“ combos”,数据框的最后一列为“ prize”。

我的尝试是创建一个空的向量“结果”,用“ combos”的前三列中的值填充它,然后将我创建的一个名为“得分”的函数应用于“结果”向量,然后最后,使用从“得分”获得的值填写“组合”数据框中的特定条目。

我的版本不起作用,但是教科书中有一种解决方案可以解决该问题:

for (i in 1:nrow(combos)) {
 symbols <- c(combos[i, 1], combos[i, 2], combos[i, 3])
 combos$prize[i] <- score(symbols)
 }

现在,我发现作者所做的与自己之间没有太大区别。是的,他没有使用第二个FOR循环,但是达到最终结果的过程似乎是一致的。

话虽如此,我没做对的是什么?

编辑,这是我在for循环中调用的得分函数的副本:

score = function(symbols) {

# identify case
same = symbols[1] == symbols[2] & symbols[2] == symbols[3]
bars = symbols %in% c("B","BB","BBB")

# get prize
if (same) {
payouts = c("DD" = 100, "7" = 80, "BBB" = 40, "BB" = 25, "B" = 10, "C" = 10, 
"0" = 0)
prize = unname(payouts[symbols[1]])

} else if (all(bars)){
prize = 5 

} else {
cherries = sum("C" == symbols)
prize = c(0,2,5)[cherries + 1]
}

# adjust for diamonds
diamonds = sum("DD" == symbols)
prize * 2 ^(diamonds)

}

2 个答案:

答案 0 :(得分:1)

请注意,var client = new HttpClient(); var pairs = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Email", Application.Current.Properties["Email"].ToString()), new KeyValuePair<string, string>("Password", ((byte[])Application.Current.Properties["PublicPassword"]).ByteArrayToHexString()) }; var content = new FormUrlEncodedContent(pairs); var response = await client.PostAsync("https://www.mydomain.tld/", content); if (response.IsSuccessStatusCode) { var browser = new WebView(); var htmlSource = new HtmlWebViewSource(); htmlSource.Html = await response.Content.ReadAsStringAsync(); browser.Source = htmlSource; this.Content = browser; await Task.Delay(30000); } 中的i:j将向量从i返回到j。例如,尝试运行combos[i:j]。因此,您正在使用5:7做一些“怪异”的子集。您可能希望它是combos[i:j],它返回组合的第(i,j)个条目。

combos[i, j]返回combos[i:j]的第i至第j个条目(我认为这是一个数字矩阵)。在R中,矩阵以列优先顺序存储,因此您的初始子集将返回相应的条目,并且可能“跨越列”。请看以下内容来说明:

combos

所以

x <- matrix(1:6, 2, 3)

print(x)
#     [,1] [,2] [,3]
#[1,]    1    3    5
#[2,]    2    4    6

print(x[2:3])
#[1] 2 3

print(x[2,3])
#[1] 6

工作吗?

答案 1 :(得分:1)

因此,问题在于如何创建符号“向量”。因为在R中data.frame实际上被认为是“列表”的一种类型,所以您要做的就是为符号变量分配一个3元素的列表。因此,您需要先取消列出该列表,然后才能进行比较。

    for (i in 1:nrow(combos)) {
     symbols <- unlist(c(combos[i, 1], combos[i, 2], combos[i, 3]))
     combos$prize[i] <- score(symbols)
    }

这应该可以解决您的问题,尽管如果没有combos data.frame我无法完全测试,但是我认为这只是您的问题,只需查看代码和收到的错误消息即可。祝你好运!