我有一个数据集如下:
value
我想将最后5列合并为1个结果,如下所示:
var gNums = []
var gPlayers = [
{
name: 'player1',
hitCounts: 0,
board: creatBingoBoard()
},
{
name: 'player2',
hitCounts: 0,
board: creatBingoBoard()
}
]
// var check=gPlayers[0].board[0][0].isHit = true
// console.table(printBingoBoard(gPlayers[0].board))
// console.table(printBingoBoard(gPlayers[1].board))
// var check = gPlayers[0].board[0][0].isHit = true
playBingo()
// console.table(gPlayers[0].board)
function playBingo() {
// debugger
resetNums()
var isVictory = false
let totalNumbersCalled = 0;
while (!isVictory) {
var calledNum = drawNum(gNums)
console.log(++totalNumbersCalled, '->', calledNum);
for (var i = 0; !isVictory && i < gPlayers.length; i++) {
var player = gPlayers[i]
markBoard(player, calledNum)
isVictory = checkBingo(player)
}
}
console.log('Player', i - 1, 'wins!'); // <- fix 1
}
function creatBingoBoard() {
resetNums()
var board = [];
const SIZE = 5;
for (var i = 0; i < SIZE; i++) {
board[i] = [];
for (var j = 0; j < SIZE; j++) {
board[i][j] = {
value: getRandomIntInclusive(0, 25),
isHit: false
}
}
}
return board;
}
function printBingoBoard(board) {
var bingoBoardCopy = []
var size = board.length
for (var i = 0; i < size; i++) {
bingoBoardCopy[i] = []
for (var j = 0; j < size; j++) {
if (board[i][j].isHit === true) {
bingoBoardCopy[i][j] = board[i][j].value + 'v'
} else bingoBoardCopy[i][j] = board[i][j].value
}
}
return bingoBoardCopy
}
function resetNums() {
gNums = []
for (var i = 0; i <= 25; i++) { // <- fix 2
gNums.push(i)
}
return gNums
}
function drawNum(nums) {
var index = getRandomIntInclusive(0, nums.length - 1); // <- fix 3
var num = nums[index];
nums.splice(index, 1);
return num;
;
}
function markBoard(player, calledNum) {
for (var i = 0; i < player.board.length; i++) {
for (var j = 0; j < player.board.length; j++) {
var cell = player.board[i][j]
if (cell.value === calledNum) { // <- fix 4
player.hitCounts++
cell.isHit = true
}
}
}
printBingoBoard(player.board)
}
function checkBingo(player) {
// for (var i = 0; i < player.length; i++) {
// if (player.hitsCount === 25) return true
if (player.hitCounts === 25) {
return true
}
return false;
}
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
//The maximum is inclusive and the minimum is inclusive
return Math.floor(Math.random() * (max - min + 1)) + min;
}
任何人都可以为我提供解决方案吗?
答案 0 :(得分:3)
我们可以使用max.col
直接获取每一行的列索引,并将其替换为数据集的列名
Type <- names(df1)[4:ncol(df1)][max.col(df1[4:ncol(df1)], 'first')]
df2 <- cbind(df1[1:3], Type = Type)
df2
# X0.501_0.499.1 X0.400_0.600 X0.400_0.600.1 Type
#1 -39.91 -63.62 -53.14 X1.Octanol
#2 -48.68 -73.45 -63.17 X1.Octanol
#3 -57.89 -84.45 -73.99 X1.Octanol
#4 -65.99 -92.61 -83.37 X1.Octanol
#5 -72.62 -101.14 -91.33 X1.Octanol
#6 -167.42 -263.80 -218.03 X1.Propanol
df1 <- structure(list(X0.501_0.499.1 = c(-39.91, -48.68, -57.89, -65.99,
-72.62, -167.42), X0.400_0.600 = c(-63.62, -73.45, -84.45, -92.61,
-101.14, -263.8), X0.400_0.600.1 = c(-53.14, -63.17, -73.99,
-83.37, -91.33, -218.03), X1.Octanol = c(1L, 1L, 1L, 1L, 1L,
0L), X1.Propanol = c(0L, 0L, 0L, 0L, 0L, 1L), X2.Butanol = c(0L,
0L, 0L, 0L, 0L, 0L), X2.propanol = c(0L, 0L, 0L, 0L, 0L, 0L),
X1.isobutanol = c(0L, 0L, 0L, 0L, 0L, 0L)),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
答案 1 :(得分:1)
这是另一个使用矩阵乘法来获取列名的基本R解决方案:
dfout <- cbind(df[1:3],Type=names(u<-df[-(1:3)])[as.matrix(u) %*% t(t(1:ncol(u)))])
这样
> dfout
X0.501_0.499.1 X0.400_0.600 X0.400_0.600.1 Type
1 -39.91 -63.62 -53.14 X1.Octanol
2 -48.68 -73.45 -63.17 X1.Octanol
3 -57.89 -84.45 -73.99 X1.Octanol
4 -65.99 -92.61 -83.37 X1.Octanol
5 -72.62 -101.14 -91.33 X1.Octanol
6 -167.42 -263.80 -218.03 X1.Propanol
答案 2 :(得分:0)
整理方式:
data%>%pivot_longer(-c(1:3), names_to="Type")%>%filter(value==1)%>%select(-value)