我想根据单独的数据帧(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
显然,我试过的两个论点都有类似的问题,但我无法弄清楚我做错了什么。
答案 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
。如果col1
是data.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)