使用r将布尔列合并为1

时间:2020-01-14 19:37:44

标签: r artificial-intelligence data-manipulation decision-tree

我有一个数据集如下:

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;
}

任何人都可以为我提供解决方案吗?

3 个答案:

答案 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)