我读了一个CSV文件到R data.frame。有些行在其中一列中有相同的元素。我想删除该列中重复的行。例如:

platform_external_dbus          202           16                     google        1
platform_external_dbus          202           16         space-ghost.verbum        1
platform_external_dbus          202           16                  localhost        1
platform_external_dbus          202           16          users.sourceforge        8
platform_external_dbus          202           16                    hughsie        1

我只需要其中一行,因为其他的在第一列中有相同的数据。


当前回答

sqldf:

# Example by Mehdi Nellen
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

解决方案:

 library(sqldf)
    sqldf('SELECT DISTINCT * FROM df')

输出:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2

其他回答

dplyr包中的distinct()函数执行任意重复删除,可以从特定列/变量中删除(如本问题中所示),也可以考虑所有列/变量。Dplyr是潮汐宇宙的一部分。

数据和包装

library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))

删除在特定列中重复的行(例如,columna)

注意.keep_all = TRUE保留所有列,否则只保留列a。

distinct(dat, a, .keep_all = TRUE)

  a b
1 1 A
2 2 B

删除与其他行完全重复的行:

distinct(dat)

  a b
1 1 A
2 2 B
3 1 C
4 2 D

sqldf:

# Example by Mehdi Nellen
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

解决方案:

 library(sqldf)
    sqldf('SELECT DISTINCT * FROM df')

输出:

  a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2

或者你可以用tidyr将cols 4和5中的数据嵌套到一行中:

library(tidyr)
df %>% nest(V4:V5)

# A tibble: 1 × 4
#                      V1    V2    V3             data
#                  <fctr> <int> <int>           <list>
#1 platform_external_dbus   202    16 <tibble [5 × 2]>

为了进行统计分析,现在删除了重复的col 2和3,但是将col 4和5数据保留在tibble中,并且可以使用unnest()在任何位置返回到原始数据帧。

一般的答案可以是 例如:

df <-  data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6))))



new_df <- df[-which(duplicated(df)), ]

输出:

      X1 X2 X3
    1  2  9  6
    2  4  6  7

对于那些来这里寻找重复行删除的一般答案的人,请使用!duplicate ():

a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)

duplicated(df)
[1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE

> df[duplicated(df), ]
  a b
2 A 1
6 B 1
8 C 2

> df[!duplicated(df), ]
  a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2

回答:从R数据帧中删除重复的行

默认情况下,该方法将保留每个副本的第一次出现。您可以使用fromLast = TRUE参数来保留每个重复项的最后一次出现。在此步骤之前,您可以对数据进行排序,以便保留所需的行。