0

我有以下数据框 df1。(编辑为在数据框中具有不同数量的重复值。)

> dput(df1)
structure(list(...1 = c("a", "b", "c", "d", "e"), x = c(5, 10, 
20, 20, 25), y = c(2, 6, 6, 6, 10), z = c(6, 2, 1, 8, 1)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

  >df1
            x     y     z 
  a         5     2     6
  b        10     6     2
  c        20     6     1
  d        20     6     8
  e        25    10     1

我想得到一个 df2,它只有每列“x”、“y”和“z”的唯一值。
我试过了:

df2<-apply(df1,2, unique)
df2 <- do.call(cbind, df2)
df2 <- as.data.frame(df2)

期望的输出:

      >df2
        x     y     z 
        5     2     6
       10     6     2
       20     10    1
       25           8
4

1 回答 1

1

Tibbles 不能有行名,因此它会在您的数据中使用它创建一个新列。您可以删除第一列,然后unique在所有列上使用。

library(dplyr)
df1$...1 <- NULL
df1 %>% summarise(across(.fns = unique))

#     x     y     z
#  <dbl> <dbl> <dbl>
#1     5     2     6
#2    10     6     2
#3    20     8     1
#4    25    10     8

或在基础 R 中:

df2 <- data.frame(sapply(df1, unique))

对于列中不相等的唯一值,您可以使用:

tmp <- lapply(df1, unique)
data.frame(sapply(tmp, `[`, 1:max(lengths(tmp))))

#   x  y z
#1  5  2 6
#2 10  6 2
#3 20 10 1
#4 25 NA 8
于 2020-12-14T08:40:19.047 回答