在列表中运行ifelse()

时间:2018-04-16 15:17:21

标签: r if-statement

我在这里有这个清单:

 structure(list(`1` = c("4", "*", ".", ".", "*", ".", ".", "*", 
"*", ".", "*", ".", ".", ".", ".", ".", "."), `2` = c("5", ".", 
".", ".", ".", ".", "*", ".", ".", ".", "*", ".", ".", ".", ".", 
"*", ".", "*", ".", ".", "*", "*", "*", "*", "*", "."), `3` = c("4", 
".", ".", ".", ".", "*", ".", ".", "*", ".", ".", "a", "*", ".", 
"*", ".", ".")), .Names = c("1", "2", "3"))

我想将符号(*和。)更改为每个列表中的数字(*到0和。到1)。

顺便说一句,如果符号以外的任何东西出现(如字母),那么我希望列表打印NA。

我已经尝试过这个,但这并没有改变任何事情......

ifelse(board_split_vec == "*", 0, 
      ifelse(board_split_vec == ".", 1, board_split_vec))

理想情况下,我必须找到一种方法来使用Base R函数来实现这一点..请不要包裹!

3 个答案:

答案 0 :(得分:3)

你也可以像这样使用lapplymatch

lapply(x, function(y) match(y, table=c(".","*", "2", "3", "4", "5")) - 1L)

返回:

$`1`
 [1] 4 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0

$`2`
 [1] 5 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0

$`3`
 [1]  4  0  0  0  0  1  0  0  1  0  0 NA  1  0  1  0  0

我们使用match返回的位置,然后减去1得到所需的0,1返回值。当一个元素不在match的表参数中时,它默认返回NA。

请注意,如果存在预先存在的0和1,则此方法将不起作用。此外,如果实际向量很长,或者列表中有大量向量,则应该查看fastmatch包。

答案 1 :(得分:1)

您可以使用lapply

lapply(df, function(x) {
  x <- ifelse(x == "*", 0,  ifelse(x == ".", 1, x))
  gsub("[^*\\.]", NA, x)  
})

答案 2 :(得分:0)

这会相当有效。通过逻辑索引进行分配:

  ( board_split_vec <- lapply( board_split_vec, 
                   function(x){ x[ x=="*"] <- 0; x[x=="."] <- 1; as.numeric(x)}) ) 
$`1`
 [1] 4 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1

$`2`
 [1] 5 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1

$`3`
 [1]  4  1  1  1  1  0  1  1  0  1  1 NA  0  1  0  1  1