将一个数据帧中的id字符替换为另一个数据帧中的id字符

时间:2014-05-06 23:07:00

标签: r

我正在尝试将数据框中的字符替换为另一个数据框中的字符。

所以,例如:

df1看起来像这样:

   Sample aac.2...Ia aac.3..I aac.3..Ia aac.3..Id
1 TG02036          -        -         -         -
2 TG03227          -        -         -         -
3 TG04597          -        -         -         -
4 TG04623          -        -         -         -
5 TG04629          -        -         -         -

我想将df1中“Sample”的匹配行替换为df2中的“Isolate.Barcode”,如下所示:

  Isolate.Barcode  Sample aac.2...Ia aac.3..I aac.3..Ia
1          TG2035 TG02036          -        -         -
2          TG1817 TG03227          -        -         -
3          TG1818 TG04597          -        -         -
4          TG1821 TG04623          -        -         -
5          TG1820 TG04629          -        -         -

我正在尝试使用带有以下代码的DataCombine包执行此操作:

df1_corrected <- FindReplace(df1, Var = "Sample", df2, 
                               from = df2$Sample, 
            to = df2$Isolate.Barcode, exact = TRUE)

我收到以下警告:

Warning messages:
1: In gsub(pattern = paste0("^", replaceData[i, from], "$"),  ... :
  argument 'pattern' has length > 1 and only the first element will be used

此外,更换不会发生。

感谢您提供的任何帮助!!

2 个答案:

答案 0 :(得分:1)

我在这里使用match,这将返回另一个?match中一个向量的匹配索引。

首先,一个可重现的例子总是好的(即我们可以复制/粘贴到R中的一个小例子来试试)::

df1 <- data.frame(Sample=letters[1:5], value=1:5, stringsAsFactors=F)
df2 <- data.frame(newID=LETTERS[c(1,3,5,6:10)], Sample=letters[c(1,3,5,6:10)], stringsAsFactors=F)
> df1
  Sample value
1      a     1
2      b     2
3      c     3
4      d     4
5      e     5
> df2
  newID Sample
1     A      a
2     C      c
3     E      e
4     F      f
5     G      g
6     H      h
7     I      i
8     J      j

因此,我们希望最终df1中的Sample列为A, b, C, d, Edf2中的唯一匹配项)。

首先,看看

match(df1$Sample, df2$Sample)
[1]  1 NA  2 NA  3

对于df1中的每一行,它返回df2的Sample列中的匹配索引。 所以:

idx&lt; - match(df1 $ Sample,df2 $ Sample)    df1 $ Sample [!is.na(idx)]&lt; - df2 $ newID [idx [!is.na(idx)]]

> df1
  Sample value
1      A     1
2      b     2
3      C     3
4      d     4
5      E     5

正如预期的那样,我们用df2的newID列替换了a,c和e,分别为A,C和E.

答案 1 :(得分:0)

至于让FindReplace工作,你的错误是from / to参数需要是replaceData data.frame中列名的字符向量。所以这似乎有用

FindReplace(df1, "Sample", df2,"Sample","Isolate.Barcode",exact=F)