【问题标题】:In-row duplicates and replace values in df with corresponding values行内重复并将 df 中的值替换为相应的值
【发布时间】:2016-02-16 18:00:28
【问题描述】:

我有一个看起来像这样的数据框

> 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.) 将 df 中的数字替换为 a 中对应的字符值。 (2.) 按行而不是按列查找重复项。现在允许 NA 留下来。

这是示例数据:

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]])
  }
}

它可以工作,但在我的 100 万 * 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。我希望很清楚我想做什么,并且有人可以为我提供解决方案。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用

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

    如果我们需要用 NA 替换重复项

    t(apply(r1, 1, function(x) replace(x, duplicated(x), NA)))
    

    【讨论】:

    • 非常感谢!这太棒了,就像一个魅力。也超级快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2019-12-22
    • 1970-01-01
    • 2020-01-17
    • 2019-06-27
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多