行内重复并将df中的值替换为相应的值

时间:2016-02-16 18:00:28

标签: r

我的数据框看起来像这样

> df
          x  y  z
    [1,] NA  6 11
    [2,]  1  7 12
    [3,]  2  8 13
    [4,]  3  9 14
    [5,]  4 10 15
    [6,]  5 NA NA

一个字符向量看起来像这样

> a
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "g" "m" "n" "o"

我想要实现的是两项任务。 (1.)用d中的相应字符值替换df中的数字。 (2.)以行方式而不是按列方式查找重复项。 NAs现在可以留下来。

以下是示例数据:

x<-c(NA,1:5)
y<-c(6:10,NA)
z<-c(11:15,NA)
df<-cbind(x,y,z)
a<-c("a","b","c","d","e","f","g","h","i","j","k","g","m","n","o")

(1.)的一个相当简单且非常缓慢的解决方案是:

new<-data.frame()
for(i in 1:ncol(df)){
  for(j in 1:nrow(df)){
    new[j,i] <- as.character(a[df[j,i]])
  }
}

它可以工作,但永远在我的1mil * 64数据集上。似乎有(2.)already here on stackoverflow的解决方案,但我不知道如何将它应用于我的问题。最终结果应如下所示:

> new
    V1   V2   V3
1 <NA>    f    k
2    a    g    g
3    b    h    m
4    c    i    n
5    d    j    o
6    e <NA> <NA>

但是第2行中的第二个g需要被NA替换。我希望很清楚我想做什么,有人为我找到解决方案。

1 个答案:

答案 0 :(得分:2)

我们可以使用

r1 <- `dim<-`(a[df], dim(df))

如果我们需要用NA

替换重复项
t(apply(r1, 1, function(x) replace(x, duplicated(x), NA)))