尝试用其他值替换数据框中的值

Posted

技术标签:

【中文标题】尝试用其他值替换数据框中的值【英文标题】:Trying to replace values in a data frame with other values 【发布时间】:2017-08-29 20:08:21 【问题描述】:

我有一个向量列表 L1 和一个数据框 df2。我想从 df2 获取值并用这些替换 L1 的值。例如,当 L1 的 ABCC10 显示“TCGA_DD_A1EG”时,我想将其替换为第 1 行 (ABCC10) 第 3 列 (TCGA.DD.A1EG) 中的值 2.193205。我想对每个值都这样做。

L1 看起来像这样:

$ABCC10
[1] "TCGA_DD_A1EG" "TCGA_FV_A3R2" "TCGA_FV_A3I0" "TCGA_DD_A1EH" "TCGA_FV_A23B"

$ACBD6
[1] "TCGA_DD_A1EH" "TCGA_DD_A3A8" "TCGA_ES_A2HT" "TCGA_DD_A1EG" "TCGA_DD_A1EB"

df2 看起来像这样:

       TCGA.BC.A10Q TCGA.DD.A1EB TCGA.DD.A1EG TCGA.DD.A1EH TCGA.DD.A1EI TCGA.DD.A3A6 TCGA.DD.A3A8
ABCC10     2.540764    0.4372165     2.193205     3.265756    0.6060301     2.927072    0.6799514
ACBD6      1.112432    0.4611697     1.274129     1.802985   -0.0475743     1.071064    0.4336301
       TCGA.ES.A2HT TCGA.FV.A23B TCGA.FV.A3I0 TCGA.FV.A3R2
ABCC10  -0.08129554    2.2963764     3.196518    0.8595943
ACBD6    1.76935812    0.3644397     1.392206    1.0282030

【问题讨论】:

介意通过复制和粘贴dput(df1)duput(df2) 的输出来提供您的数据集吗? 您的df1 看起来像list。你确定是df吗? @RuiBarradas 它是一个由列表组成的数据框 它看起来像 listvectors。另一方面,df1dataframe 是的,确实如此。我从一个更大的数据框中获取了 df1,但它本身就是一个列表。 @user 【参考方案1】:

一种方法可能是这样的

df1 = list(ABCC10 = c("TCGA_DD_A1EG", "TCGA_FV_A3R2", "TCGA_FV_A3I0", "TCGA_DD_A1EH", "TCGA_FV_A23B"),
           ACBD6 = c("TCGA_DD_A1EH", "TCGA_DD_A3A8", "TCGA_ES_A2HT", "TCGA_DD_A1EG", "TCGA_DD_A1EB"))

df2 = data.frame(TCGA.BC.A10Q = c(2.540764, 1.112432),
                 TCGA.DD.A1EB = c(0.4372165, 0.4611697),
                 TCGA.DD.A1EG = c(2.193205, 1.274129),
                 TCGA.DD.A1EH = c(3.265756, 1.802985),
                 TCGA.DD.A1EI = c(0.6060301, -0.0475743),
                 TCGA.DD.A3A6 = c(2.927072, 1.071064),
                 TCGA.DD.A3A8 = c(0.6799514, 0.4336301),
                 TCGA.ES.A2HT = c(-0.08129554, 1.76935812),
                 TCGA.FV.A23B = c(2.2963764, 0.3644397),
                 TCGA.FV.A3I0 = c(3.196518, 1.392206),
                 TCGA.FV.A3R2 = c(0.8595943, 1.0282030),
                 row.names = c('ABCC10', 'ACBD6'))

for(i in 1:length(df1))
  for(j in 1:length(df1[[1]]))
    df1[names(df1)[i]][[1]][j] = df2[names(df1)[i],gsub("_",".",df1[names(df1)[i]][[1]][j])]
  

输出是:

$ABCC10
[1] "2.193205"  "0.8595943" "3.196518"  "3.265756"  "2.2963764"

$ACBD6
[1] "1.802985"   "0.4336301"  "1.76935812" "1.274129"   "0.4611697" 

希望这会有所帮助!

【讨论】:

@merryberry 想知道您是否遇到解决方案的任何问题,因为正确答案标记正在被撤消?!【参考方案2】:

也许以下会做到这一点。 首先,组成一些数据,一个list和一个data.frame

df1 <- list(A = letters[1:3], B = letters[5:7])

df2 <- data.frame(a = rnorm(2), b = rnorm(2), c = rnorm(2),
                  e = rnorm(2), f = rnorm(2), g = rnorm(2))
row.names(df2) <- c('A', 'B')

现在是代码。

for(i in seq_along(df1))
    x <- gsub("_", ".", df1[[i]])
    inx <- match(x, names(df2))
    df1[[i]] <- df2[i, inx]

df1

在我的测试中,它做了你想要的。如果它不适合您的实际问题,请直说。

【讨论】:

当我用数据尝试这个时,“[.data.frame(bla2, i, inx) 中的错误:选择了未定义的列”导致@RuiBarradas @merryberry 那是因为df1 有下划线,df2 有圆点。他们不匹配。我可以添加代码来解决这个问题。或者也许你应该这样做。 @merryberry 我刚刚用上一条评论中所说的内容编辑了我的代码。 我的 df1 中的一些名称是重复的,但 TCGA 值不同。我希望代码将这些重复的名称视为正常,但它却给了我 NA。其他一切正常。

以上是关于尝试用其他值替换数据框中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何用同一数据框中其他列的实际列值替换一列中的字符串值?

用其他数据框中的匹配值替换索引值

如何将逗号添加到数据框中的现有值中?熊猫

用向量中的随机值填充数据框中的 NA 值(无需替换)

如何用(data.frame)查找表中的值标签替换数据框中的数字代码?

替换textarea文本值中的换行符