R语言按逻辑索引修改table单元格时如何保留原表格格式
R语言修改table对象单元格值并保留原有格式的方法
问题场景
现有如下两个R对象:
- 列联表对象
tableA:
tableA <-structure(c(0L, 1L, 2L, 0L, 3L, 0L, 3L, 2L, 0L), dim = c(3L, 3L), dimnames = structure(list(c("0.3", "0.4", "0.6"), c("A", "B", "C")), names = c("", "")), class = "table") # 打印预览 # A B C # 0.3 0 0 3 # 0.4 1 3 2 # 0.6 2 0 0
- 逻辑索引对象
i1,标记需要修改的单元格位置:
i1 <- structure(c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), dim = c(3L, 3L), dimnames = structure(list(c("0.3", "0.4", "0.6"), c("A", "B", "C")), names = c("", ""))) # 打印预览 # A B C # 0.3 FALSE FALSE FALSE # 0.4 TRUE FALSE TRUE # 0.6 FALSE FALSE FALSE
需求为:对i1中值为TRUE的对应位置,在tableA的单元格值后追加(replaced)标记,同时保留对象的table类型。
问题复现
之前尝试的操作如下,执行后对象被转为list类型,丢失了原有的table格式:
# 尝试转字符串类型 tableA[] <- lapply(tableA, as.character) # 尝试索引赋值 tableA[i1] <- paste0(tableA[i1], " (replaced)")
正确实现方法
table类本质是继承自array(数组)的对象,底层存储是向量而非列表,不要用lapply做遍历转换(会返回列表破坏结构),直接修改存储模式为字符型即可完整保留维度、维度名、类属性:
# 建议先复制原对象,避免修改源数据 res <- tableA # 修改存储模式为字符型,保留所有结构属性 storage.mode(res) <- "character" # 按逻辑索引赋值 res[i1] <- paste0(res[i1], " (replaced)")
执行后查看结果:
> res A B C 0.3 "0" "0" "3 (replaced)" 0.4 "1" "3 (replaced)" "2" 0.6 "2" "0" "0" > class(res) [1] "table"
可以看到修改后对象依旧是table类型,单元格修改符合预期。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

