我只是盯着R,我试着比较两个不同表的两列。 如果匹配为真,那么我想替换特定值(在df1中)。 我也遇到了这个问题,因为我想在数据库中使用脚本,因此使用其他软件包非常有限。
DF1:
DE
Deutschland
England
Germany
Italien
DF2
GE EN
Deutschland Germany
Italien Italy
England UK
结果: DF1:
DE
Deutschland
England
**Deutschland**
Italien
我尝试了以下代码:
df1 <- data.frame("DE" = c("Deutschland", "England", "Germany", "Italien"))
df2 <- data.frame("GE" = c("Deutschland", "Italien", "England"), "EN" = c("Germany", "Italy", "UK"))
df1[] <- lapply(df1, as.character)
df2[] <- lapply(df2, as.character)
df1 <- ifelse(!(df1$DE %in% df2$EN), df1$DE, df2$GE)
取代“德国”而不是“英格兰”。如何更换右侧的行?
答案 0 :(得分:6)
使用match
及其nomatch
- 运算符:
df1$DE[df1$DE %in% df2$EN] <- df2$GE[match(df1$DE, df2$EN, nomatch = 0)]
给出:
> df1 DE 1 Deutschland 2 England 3 Deutschland 4 Italien
这是做什么的:
df1$DE[df1$DE %in% df2$EN]
表示df1
中哪些行需要替换。df2$GE[match(df1$DE, df2$EN, nomatch = 0)]
从df2
选择替换。<-
分配给前者。正如the comments中@ r2evans所指出的那样,%in%
使用了match
。基于这些知识,您也可以这样做:
ind <- match(df1$DE, df2$EN, nomatch = 0)
df1$DE[ind > 0] <- df2$GE[ind]
因为索引ind
现在只创建一次,所以这可能会导致大型数据集的大量增加。
您也可以使用data.table
更新联接来执行此操作:
# load the package
library(data.table)
# convert the dataframes to data.table's
setDT(df1)
setDT(df2)
# perform the update join
df1[df2, on = .(DE = EN), DE := GE][]
给出相同的结果:
DE 1: Deutschland 2: England 3: Deutschland 4: Italien