替换数据框中某一列的所有值。

3

我有一个非常简单的问题。我有一个大型数据框,并且我需要按照以下模式替换第2列(cluster)中的值:

1 -> 3
2 -> 5
3 -> 1
5 -> 2

> dput(head(df))
structure(list(Target = c("TRINITY_GG_100011_c0_g1_i3.mrna1", 
"TRINITY_GG_100011_c0_g1_i5.mrna1", "TRINITY_GG_100011_c0_g1_i6.mrna1", 
"TRINITY_GG_100011_c0_g1_i9.mrna1", "TRINITY_GG_100016_c0_g1_i1.mrna1", 
"TRINITY_GG_100016_c0_g1_i2.mrna1"), cluster = c(2L, 5L, 5L, 
3L, 4L, 5L), AAA = c(9L, 7L, 8L, 7L, 
5L, 5L)), row.names = c(NA, 6L), class = "data.frame")

#normally I will do it like this:
df$cluster[df$cluster == 1]  <- 3

问题在于,一旦我将1更改为3,下一次我必须将3更改为1,那就会再次更改它。因此,我不能按顺序逐个更改。我需要一种可以同时更改所有原始数字的方法。
2个回答

1
我们可以使用命名向量并进行替换。
library(dplyr)
df %>%
   mutate(cluster = coalesce(setNames(c(3, 5, 1, 2),
         c(1, 2, 3, 5))[as.character(cluster)], cluster))

-输出

#                            Target cluster AAA
#1 TRINITY_GG_100011_c0_g1_i3.mrna1       5   9
#2 TRINITY_GG_100011_c0_g1_i5.mrna1       2   7
#3 TRINITY_GG_100011_c0_g1_i6.mrna1       2   8
#4 TRINITY_GG_100011_c0_g1_i9.mrna1       1   7
#5 TRINITY_GG_100016_c0_g1_i1.mrna1       4   5
#6 TRINITY_GG_100016_c0_g1_i2.mrna1       2   5

其中一个缺点是对于不在命名向量中的元素,它将返回NA。为了在返回NA的地方返回原始向量值,在更新列中使用coalesce进行包装,以便如果在更新列中有NA,则返回旧向量的相应值。


或者可以使用键/值数据集进行连接。

library(data.table)
setDT(df)[data.frame(cluster = c(1, 2, 3, 5), new = c(3, 5, 1, 2)), 
     cluster := new, on = .(cluster)]

1

一种使用match + ifelse的基本R选项

p <- c(1,2,3,5)
q <- c(3,5,1,2)
transform(
  df,
  cluster = ifelse(cluster %in% q,p[match(cluster,q)],cluster)
)

提供

                            Target cluster AAA
1 TRINITY_GG_100011_c0_g1_i3.mrna1       5   9
2 TRINITY_GG_100011_c0_g1_i5.mrna1       2   7
3 TRINITY_GG_100011_c0_g1_i6.mrna1       2   8
4 TRINITY_GG_100011_c0_g1_i9.mrna1       1   7
5 TRINITY_GG_100016_c0_g1_i1.mrna1       4   5
6 TRINITY_GG_100016_c0_g1_i2.mrna1       2   5

谢谢,运行得非常完美,今后知道 R 基本选项也是不错的。 - Amaranta_Remedios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接