r - 使用 base R 根据另一个数据集中的值索引替换数据集中的值
问题描述
structure(list(ID = c(123, 5345, 234, 453, 3656, 345), diagnosis_1 = c("B657",
"B658", "B659", "B660", "B661", "B662"), diagnosis_2 = c("F8827",
"G432", NA, "B657", NA, "H8940"), diagnosis_3 = c(NA, "B657",
NA, NA, NA, "G432"), diagnosis_4 = c(NA, NA, NA, NA, NA, "B657"
), diagnosis_5 = c(NA, NA, NA, NA, NA, NA), diagnosis_6 = c(NA,
NA, NA, NA, NA, NA), diagnosis_7 = c(NA, NA, NA, NA, NA, NA),
diagnosis_8 = c(NA, NA, NA, NA, NA, NA), diagnosis_9 = c(NA,
NA, NA, NA, NA, NA), diagnosis_10 = c(NA, NA, NA, NA, NA,
NA), diagnosis_11 = c(NA, NA, NA, NA, NA, NA), diagnosis_12 = c(NA,
NA, NA, NA, NA, NA), diagnosis_13 = c(NA, NA, NA, NA, NA,
NA), age = c(54, 65, 23, 22, 33, 77)), row.names = c(NA,
-6L), class = "data.frame")
我想用该索引中的值替换诊断列中的值:
B657 1
B658 2
B659 3
B660 4
B661 5
B662 1
F8827 3
G432 3
H8940 4
实际上,该表有数千行,并且我处理具有可变数量的诊断列的其他表,因此与列数无关的解决方案将是理想的。该索引也长达数百个条目。
如果索引表是这样划分的:
1 B657, B662
2 B658
3 B659, F8827, G432
4 B660 H8940
5 B661
这会对它的编码方式产生影响吗?
所需的输出如下所示:
非常感谢
解决方案
你可以试试这个
df_replace <- read.table(text="B657 1
B658 2
B659 3
B660 4
B661 5
B662 1
F8827 3
G432 3
H8940 4", stringsAsFactors = F)
vec_repl <- as.character(df_replace$V2)
names(vec_repl) <- df_replace$V1
library(tidyverse)
df %>%
mutate_at(vars(starts_with("diag")), ~str_replace_all(., vec_repl))
ID diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4 diagnosis_5 diagnosis_6 diagnosis_7 diagnosis_8 diagnosis_9 diagnosis_10 diagnosis_11 diagnosis_12 diagnosis_13
1 123 1 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 5345 2 3 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 234 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 453 4 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 3656 5 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
6 345 1 4 3 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
age
1 54
2 65
3 23
4 22
5 33
6 77
在基础中,您可以尝试使用R
附加包stingr
df2 <- df
# use -c(1,ncol(df)) to select only columns where to replace values.
df2[,-c(1,ncol(df))] <- lapply(df[,-c(1,ncol(df))], function(x) str_replace_all(x, vec_repl))
head(df2)
ID diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4 diagnosis_5 diagnosis_6 diagnosis_7 diagnosis_8 diagnosis_9 diagnosis_10 diagnosis_11 diagnosis_12 diagnosis_13
1 123 1 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 5345 2 3 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 234 3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 453 4 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 3656 5 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
6 345 1 4 3 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
age
1 54
2 65
3 23
4 22
5 33
6 77
推荐阅读
- django - django 模板 url 匹配的工作原理
- python - 无法在 MacOS 上安装 mysqlclient
- perl - 覆盖在模块中定义但在其运行时阶段使用之前的函数?
- flutter - 避免 Flutter 的数据轮询
- python - KeyError 的问题:'val_acc'
- filter - 无法使用 Primeng Turbo Table 过滤 Angular 7 中的嵌套对象
- python - 为什么静态文件不会在 django web 应用程序中加载?
- java - 如何检查字符串是否包含 3 位或更多位
- spring - 将 Spring Boot 配置为同时使用 H2 和 Oracle
- java - 使用递归在不更改字符顺序的情况下反转 Java 中的句子