用字符串替换列表值

Replacing a list value with a string

我有如下数据:

dat <- list(c(0, 25, 100, 250, 500, 1000, 1e+06))

我只是想用字符串值 "Infinity" 替换值 1000000。尽管:

dat[1]
# [[1]]
# [1]       0      25     100     250     500    1000 1000000

dat[[1]

# [1]       0      25     100     250     500    1000 1000000

如果我尝试:

gsub(1000000, "Infinity", dat[[1]])

没有任何反应。为什么在这种情况下什么也没有发生,正确的方法是什么?

您需要将 RHS gsub 调用分配给 LHS 变量,可能是列表中的向量本身。但是,鉴于您的初始向量包含数值,您应该在此处使用相等性:

dat[[1]][dat[[1]] == 1000000] <- "Infinity"
dat

[[1]]
[1] "0" "25" "100" "250" "500" "1000" "Infinity"

如果你真的要使用gsub,你需要设置fixed = TRUE

dat <- list(c(0, 25, 100, 250, 500, 1000, 1e+06))

dat[[1]] <- gsub(1000000, "Infinity", dat[[1]], fixed = T)

dat
[[1]]
[1] "0"        "25"       "100"      "250"      "500"      "1000"    
[7] "Infinity"

我们可以使用 rapplyrapply 是 lapply 的递归版本,在结果结构方面具有灵活性(how = "..")。参见 ?rapply

rapply(dat,function(x) ifelse(x==1000000,"Infinity",x), how = "replace")
[[1]]
[1] "0"        "25"       "100"      "250"      "500"      "1000"     "Infinity"

另一个使用 replacelapply 的选项(尽管 rapplylapply 更好):

lapply(dat, function(x) replace(x, x == 1000000, "Infinity"))

输出

[[1]]
[1] "0"        "25"       "100"      "250"      "500"      "1000"     "Infinity"