0

这是R 中粘贴/折叠的后续行动, 我认为开始一个新问题比用新问题无休止地编辑前一个问题更可取。

我要做的是一些我想模拟玩游戏的向量。目标是随机选择两种策略进行对抗,然后生成结果矩阵,一个神奇的 for 循环将为每个策略分配一个分数。

###Sample Strategies
whales <- c("C","D","C","D","D")
quails <- c("D","D","D","D","D")
snails <- c("C", "C", "C", "C", "C")
bales  <- c("D", "D", "C", "D", "C")

####Combining into a matrix
gameboard<-cbind(whales, quails, bales, snails, deparse.level = 1)

####All of the names of the strategies/columns
colnames(gameboard)

####Randomly pick two random column names
game1<- colnames(gameboard)[sample(1:ncol(gameboard), 2, replace= FALSE)]

results <-paste(game1[1], game1[2], sep='')

现在这确实有效,除了我实际上访问的是列名,而不是列中的数据。因此,当我想要 CD DD CC DD DC 的实际串联时,我最终会得到类似“whalesbales”的结果。

也许“申请”或“申请”......在这里申请?

不可避免的后续问题是我如何才能让最后一行显示“结果”而不是“results_whalesVbales”?因为我假设

results"game1[1]", sep='V',game1[2]"

不会削减它,并且有一些丑陋的方法可以使用大量括号和块引号来做到这一点。

#

跟进

提前感谢您的建议。

感谢费迪南德的回应和详尽的解释-一些后续行动:

(1) 有没有办法得到 paste(.Last.value, collapse="") [1] "DC DD CC DD CD"

结果是一个名为 result_balesVwhales 的新对象(向量?)

 paste0("results_", paste(colnames(gameboard [randompair],collapse="V"))
 [1] "results_balesVwhales"

到目前为止,我所做的一切都使向量的值为 results_balesVwhales。

(2) 我可以强制新的 results_balesVwhales 具有包和鲸鱼各自具有的“长”(柱状)格式,而无需重塑?

4

1 回答 1

0

斐迪南回答了第一个问题。关于你的第二个问题......你问的功能是assign.

 x = 'foo'
 assign(x, 2)
 foo
 # [1] 2

但是,有龙……相反,R 的做法是分配给命名列表的元素:

game1 <- sample(colnames(gameboard), 2)
result <- list()
list_name <- paste0("results_", paste(colnames(gameboard)[game1], collapse="V"))
result[[list_name]] <- paste(gameboard[, game1[1]], 
                             gameboard[, game1[2]], 
                             sep='', 
                             collapse=' ')

如果你想要粘贴元素的向量,只需删除collapse我在下面所做的。

最终,一旦我理清了我希望这一切如何工作,我会将它包装在一个或两个函数中。这些可以更清晰,但冗长说明了这个想法。

my_game <- function(trial, n_samples, dat) {
    # as per my comment, generate the game result and name using the colnames directly
    game <- sample(colnames(dat), n_samples)
    list_name <- paste0("results_", paste(game, collapse="V"))
    game_result <- paste(dat[, game[1]], 
                         dat[, game[2]], 
                         sep='')

    # return both the name and the data in the format desired to parse out later
    return(list(list_name, game_result))
}

my_game_wrapper <- function(trials, n_samples, dat) {
   # for multiple trials we create a list of lists of the results and desired names
   results <- lapply(1:trials, my_game, n_samples, dat)
   # extract the names and data
   result_names <- sapply(results, '[', 1)
   result_values <- sapply(results, '[', 2)

   # and return them once the list is pretty.
   names(result_values) <- result_names
   return(result_values)
}

my_game_wrapper(3, 2, gameboard)

# $results_quailsVwhales
# [1] "DC" "DD" "DC" "DD" "DD"

# $results_quailsVbales
# [1] "DD" "DD" "DC" "DD" "DC"

# $results_balesVquails
# [1] "DD" "DD" "CD" "DD" "CD"
于 2013-08-28T16:21:17.467 回答