我在这里有这个清单:
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函数来实现这一点..请不要包裹!
答案 0 :(得分:3)
你也可以像这样使用lapply
和match
:
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