0

将值替换/添加到数据框 x 中的列,查看 R 中数据框 y 中的值

临时文件或 X 是一个非常大的数据框

     1     idname    3    unit
      aa    jhn      cc   NA
      dd    m234     ff   NA
      gg    cind     ii   NA
      nn    ....
      pp.....

地图文件或 Y 是一个小数据框

name    id            contact     address
john    jhn           J123        J
Mary    Mry           M234        M

我的条件是

for(i in 1:length(x$1)) {
  if (X$2==Y$alt_name1 || X$2==Y$alt_name2 || X$2==Y$alt_name3)
  X$name[i] = Y$name[i]
}

也就是说,如果 Y 中除 Y$name 之外的任何列中的值与 X$2 中的值匹配,则相应的 Y$name 应添加到 X$name 的确切行中

有没有什么有效的方法来执行这个操作?x 有几百万行,y 有 4 行。

很感谢任何形式的帮助。

我现在拥有的是

for (i in 1: length(tempFile$unit)) {
    for (j in 1: length(mapFile$Name)) {
        if (tempFile$idname[i]==mapFile$id[j])
        elseif (tempFile$idname[i]==mapFile$contact[j]) 
        elseif (tempFile$idname[i]==mapFile$address[j])             
        tempFile$unit[i] <- mapFile$Name[j]
        }
    }
4

1 回答 1

0
big.df <- read.table(text = "1     2     3    name
aa    jhn   cc   NA
dd    m234  ff   NA
gg    cind  ii   NA",
                     header = TRUE, check.names=FALSE, as.is = TRUE)

small.df <- read.table(text = "name    alt_name1     alt_id   alt_name3
john    jhn           J123        J
Mary    Mry           M234        M", 
                       header = TRUE, check.names=FALSE, as.is = TRUE)


alt.names <- big.df[, 1:3]

alt.key <- small.df[, 2]

ifelse(alt.names[, 1] %in% alt.key |
       alt.names[, 2] %in% alt.key |
       alt.names[, 3] %in% alt.key, alt.key, NA)

像这样的东西应该工作。显然你会想把它弄干一点,但它ifelse是矢量化的,你可以简单地将结果传递namebig.df. 您也可以在不ifelse使用match或的情况下执行此操作%in%(它只是匹配作为二元运算符),它必须比循环快得多。

于 2013-06-21T19:22:30.340 回答