unique()表示多个变量

Meh*_*lar 66 r unique

我在R中有以下数据框:

> str(df)
'data.frame':   545227 obs. of  15 variables:
 $ ykod : int  93 93 93 93 93 93 93 93 93 93 ...
 $ yad  : Factor w/ 42 levels "BAKUGAN","BARBIE",..: 30 30 30 30 30 30 30 30 30 30 ...
 $ per  : Factor w/ 3 levels "2 AYLIK","3 AYLIK",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ donem: int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ sayi : int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ mkod : int  4 5 9 11 12 18 20 22 25 26 ...
 $ mad  : Factor w/ 10464 levels "   Defne Market          ",..: 405 8075 9710 10145 9297 7973 2542 3892 2759 5769 ...
 $ mtip : Factor w/ 29 levels "Abone Bürosu                                      ",..: 2 20 20 2 2 2 2 2 2 2 ...
 $ kanal: Factor w/ 2 levels "OB","SS": 2 2 2 2 2 2 2 2 2 2 ...
 $ bkod : int  110565 110565 110565 110565 110565 110565 110565 110565 110565 110565 ...
 $ bad  : Factor w/ 212 levels "4. Levent","500 Evler",..: 167 167 167 167 167 167 167 167 167 167 ...
 $ bolge: Factor w/ 12 levels "Adana ?ehiriçi",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ sevk : int  2 3 3 3 2 2 2 6 2 2 ...
 $ iade : int  2 1 0 2 0 2 1 0 0 2 ...
 $ satis: int  0 2 3 1 2 0 1 6 2 0 ...
Run Code Online (Sandbox Code Playgroud)

我想列出所选多个变量的唯一(如SQL的DISTINCT)值.例如,unique(yad)给我每个42个元素的名称,但我需要提取两列(yad并且per一起使用所有唯一组合):

yad           per
---           ---
BARBIE        AYLIK
BAKUGAN       2 AYLIK
MICKEY MOUSE  2 AYLIK
TINKERBELL    3 AYLIK
...           ...
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Jos*_*ien 119

如何使用unique()自己?

df <- data.frame(yad = c("BARBIE", "BARBIE", "BAKUGAN", "BAKUGAN"),
                 per = c("AYLIK",  "AYLIK",  "2 AYLIK", "2 AYLIK"),
                 hmm = 1:4)

df
#       yad     per hmm
# 1  BARBIE   AYLIK   1
# 2  BARBIE   AYLIK   2
# 3 BAKUGAN 2 AYLIK   3
# 4 BAKUGAN 2 AYLIK   4

unique(df[c("yad", "per")])
#       yad     per
# 1  BARBIE   AYLIK
# 3 BAKUGAN 2 AYLIK
Run Code Online (Sandbox Code Playgroud)

  • 我不知道`dplyr :: distinct()`,但是如果你想保持整行第一次出现的组合,请看看`duplicated()`.在这里,您可以这样做:`df [!duplicated(df [1:2]),]`. (4认同)
  • +1 还建议对字符串进行标准化(tolower、gsub 输出特殊字符等)。 (2认同)
  • 实际上我发现`unique.matrix()`完成了这项工作,无论如何 (2认同)

mic*_*cah 13

基于任何列都是唯一的,并使用 保留所有其他列dplyr

df <- df %>%
distinct(col1, col2, .keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 正如该命令的文档所述,该技术比“unique.data.frame()”及其变体“快得多”。 (2认同)

raf*_*ira 12

这是Josh答案的补充.

您还可以在data.table中过滤掉重复的行时保留其他变量的值

例:

library(data.table)

#create data table
dt <- data.table(
  V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)],
  V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)],
  V3=c(1),
  V4=c(2) )

> dt
# V1 V2 V3 V4
# A  B  1  2
# A  C  1  2
# A  D  1  2
# A  B  1  2
# B  A  1  2
# C  D  1  2
# C  D  1  2
# E  F  1  2
# G  G  1  2
# A  B  1  2

# set the key to all columns
setkey(dt)

# Get Unique lines in the data table
unique( dt[list(V1, V2), nomatch = 0] ) 

# V1 V2 V3 V4
# A  B  1  2
# A  C  1  2
# A  D  1  2
# B  A  1  2
# C  D  1  2
# E  F  1  2
# G  G  1  2
Run Code Online (Sandbox Code Playgroud)

警报:如果其他变量中有不同的值组合,那么结果将是

V1和V2的独特组合


Hon*_*Ooi 5

有几种方法可以获得一系列因素的所有独特组合.

with(df, interaction(yad, per, drop=TRUE))   # gives labels
with(df, yad:per)                            # ditto

aggregate(numeric(nrow(df)), df[c("yad", "per")], length)    # gives a data frame
Run Code Online (Sandbox Code Playgroud)