尝试用其他值替换数据框中的值
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 它是一个由列表组成的数据框
它看起来像 list
的 vectors
。另一方面,df1
是 dataframe
。
是的,确实如此。我从一个更大的数据框中获取了 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。其他一切正常。以上是关于尝试用其他值替换数据框中的值的主要内容,如果未能解决你的问题,请参考以下文章