Rab*_* KC 1 indexing r rename gsub
说一个数据集:
a <- c(101,101,102,102,103,103)
b <- c("M","M","P","P","M","M")
dt <- as.data.frame(cbind(a,b))
dt
a b
1 101 M
2 101 M
3 102 P
4 102 P
5 103 M
6 103 M
Run Code Online (Sandbox Code Playgroud)
a 列是subject_ID,b 列是subject_name。我想将主题 ID 101 唯一重命名为 M1,将 103 重命名为 M2。
有没有办法通过索引来做到这一点?
这是行不通的。
dt.try1 <- gsub("M","M1",dt[1:2,c(2)])
dt.try1
[1] "M1" "M1"
Run Code Online (Sandbox Code Playgroud)
这是理想的结果:
a b
1 101 M
2 101 M
3 102 P
4 102 P
5 103 M2
6 103 M2
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
样本数据。
a <- c(101,101,102,102,103,103)
b <- c("M","M","P","P","M","M")
dt <- data.frame(a, b)
Run Code Online (Sandbox Code Playgroud)
仅供参考,切勿用于data.frame(cbind(..))创建框架:在这种情况下,由于至少有一个向量是character,因此它们都将是character,因为cbind默认情况下创建矩阵(与框架不同,仅限于一类)。这里直接使用总是更好data.frame(..)。
注意:为了清楚起见,您的“理想输出”显示M,M,P,P,M2,M2,但您之前的代码块试图将前两个更改为M1。我的代码基于这样的假设:您需要前两个而不M1只是M. (就此而言,akrun 的答案是正确的,尽管这种方法可以调整。)
library(dplyr)
dt %>%
distinct(a, b) %>%
group_by(b) %>%
mutate(b = if (n() > 1) paste0(b, row_number()) else b) %>%
left_join(dt, ., by = "a", suffix = c(".x", "")) %>%
select(-b.x)
# a b
# 1 101 M1
# 2 101 M1
# 3 102 P
# 4 102 P
# 5 103 M2
# 6 103 M2
Run Code Online (Sandbox Code Playgroud)
dt2 <- unique(dt[, c("a", "b")])
dt2$b <- ave(dt2$b, dt2$b, FUN = function(z) if (length(z) > 1) paste0(z, seq_along(z)) else z)
dt2
# a b
# 1 101 M1
# 3 102 P
# 5 103 M2
merge(subset(dt, select = -b), dt2, by = "a")
# a b
# 1 101 M1
# 2 101 M1
# 3 102 P
# 4 102 P
# 5 103 M2
# 6 103 M2
Run Code Online (Sandbox Code Playgroud)