使用不同长度的单独数据帧替换字符向量

时间:2018-04-19 18:38:02

标签: r if-statement gsub

我想根据单独的数据帧(df1)重新编码/重命名字符向量(~35,000行)(col1)。它们都是特征向量。

col1
C
B
M A
B
R R
C
R R
M A
B

df1:

V1   V2
B    blanket
C    toy
M A  blarg
R R  targe

结果将是

col1
toy
blanket
blarg
blanket
targe
toy
targe
blarg
blanket

我要做的是说"如果V1 = col1,则替换为V1 = V2" 我试着写下字面意思:

out<-if(col1==df$V1){replace(df$V1 == df$V2)}

抛出:

Warning message:
In if (testdat == schooldf$V1) { :
  the condition has length > 1 and only the first element will be used

我尝试使用gsub:

out<-gsub(df$V1, df$V2, col1)

抛出:

1: In gsub(schooldf$V1, schooldf$V2, testdat) :
  argument 'pattern' has length > 1 and only the first element will be used
2: In gsub(schooldf$V1, schooldf$V2, testdat) :
  argument 'replacement' has length > 1 and only the first element will be used

显然,我试过的两个论点都有类似的问题,但我无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

您使用replace代码获得的警告来自于您使用if()这一事实,这是用于流量控制而非变量创建。它仅用于取长度为1的逻辑值(TRUE或FALSE)。此外replace的语法不正确,请参阅下面的?replace或我的答案的最后一部分:

一个想法是使用match而不是replace执行此操作。 replace一次只能处理一个条件

col2 <- df1$V2[match(col1, df1$V1)]
col2
#[1] "toy"     "blanket" "blarg"   "blanket" "targe"   "toy"     "targe"   "blarg"   "blanket"

结果是一个字符向量,因为你说的是​​你问题中的col1。如果col1data.frame,您仍然可以使用相同的方法。

如果你有一些潜在的不匹配,你可以使用replace来确保原始的col1值仍然存在:

replace(col2, is.na(col2), col1[which(is.na(col2))])

答案 1 :(得分:0)

假设merge位于col

,您也可以使用df

merge(df1, df, by.x = "v1", by.y = "col", all.y=T)