沿列值传递到粘贴

时间:2013-08-27 22:17:41

标签: r naming paste

这是Paste/Collapse in 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'这样的结果。

也许'申请'或'lapply'......在这里申请?

不可避免的后续问题是我如何才能得到最后一行,其中“结果”代替“results_whalesVbales”? 因为我假设

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

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

关注

提前感谢您的建议。

感谢费迪南德的回应和详尽的解释 - 几个跟进:

(1)有没有办法获得     粘贴(.Last.value,collapse =“”)     [1]“DC DD CC DD CD”

结果是一个基于

命名为result_balesVwhales的新对象(vector?)
 paste0("results_", paste(colnames(gameboard [randompair],collapse="V"))
 [1] "results_balesVwhales"

到目前为止我尝试过的所有内容都使得vector的值为results_balesVwhales。

(2)我是否可以强制新的results_balesVwhales具有“长”(柱状)格式,每种格式都包含鲸鱼和鲸鱼,而不是重塑?

1 个答案:

答案 0 :(得分: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"