我正在尝试将数据框中的字符替换为另一个数据框中的字符。
所以,例如:
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
此外,更换不会发生。
感谢您提供的任何帮助!!
答案 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, E
(df2
中的唯一匹配项)。
首先,看看
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)