比较和替换特定行的框架/表格

时间:2017-12-31 18:53:04

标签: r

我只是盯着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)

取代“德国”而不是“英格兰”。如何更换右侧的行?

1 个答案:

答案 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