R:擦除各列中的重复元素,保留优先出现并重新定位值

R: erase duplicated element across columns, keep first ocurrence and relocate values

提问人:David Jorquera 提问时间:11/8/2023 更新时间:11/8/2023 访问量:40

问:

我有一个大型数据帧,其中包含许多包含电子邮件的列。这些电子邮件有时会在同一行的列之间重复。我正在尝试找到一种方法来删除重复项并重新定位值以填补已删除值留下的空白。

在过去的几个小时里,我发现的关于这个主题的所有内容都涉及重复的行,但这更像是跨列的重复值。

这是一个测试我的想法:data.frame

    data <- data.frame(V1 = LETTERS[1:4], V2 = c(NA, "F", NA, NA), V3 = LETTERS[4:1], V4 = c("A", "D", "B", "F"))
    data
  V1   V2 V3 V4
1  A <NA>  D  A
2  B    F  C  D
3  C <NA>  B  B
4  D <NA>  A  F

以下是所需的输出:

  V1  V2   V3   V4
1  A   D <NA> <NA>
2  B   F    C    D
3  C   B <NA> <NA>
4  D   A    F <NA>

提前致谢!

r dplyr 数据表

评论


答:

3赞 Maël 11/8/2023 #1

下面是一个基本的 R 选项:apply

  1. unique(x[!is.na(x)])获取唯一的非 NA 值:例如,变成A NA D AA D
  2. "length<-"(..., length(x))将原始向量 () 的长度分配给输出。它通过在最后填充 NA 来做到这一点:例如,变成 .xA DA D NA NA
  3. apply(data, 1, ...)将上述函数应用于数据集的所有行 ()。MARGIN = 1
  4. apply的输出需要被分解,并分配给原始 data.frame() 以保留原始数据集的属性。tdata[] <-
data[] <- t(apply(data, 1, \(x) `length<-`(unique(x[!is.na(x)]), length(x))))

data
#   V1 V2   V3   V4
# 1  A  D <NA> <NA>
# 2  B  F    C    D
# 3  C  B <NA> <NA>
# 4  D  A    F <NA>

评论

1赞 Jilber Urbina 11/8/2023
不错的答案!您可以使用以下方法缩短替换时间:x[!is.na(x)]na.omit(x)
0赞 David Jorquera 11/8/2023
我得到了Error: unexpected input in "t(apply(data, 1, \"
1赞 Maël 11/8/2023
哦,是的,用代替 \。这是因为你\是最近才被介绍的function