保留重复元素一次,整个数据帧保存在r中

时间:2017-01-20 02:44:28

标签: r dplyr

我想根据第一列中的重复元素删除行,但也希望保留第二列。我可以使用第二列中与重复元素相关的任何值。

输入:

df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6)

预期产出:

col1 col2
a    1
b    4

,或者

col1 col2
    a    2
    b    5

到目前为止尝试使用以下命令但不保留整个数据帧:

df[(duplicated(df$col1)),] 

3 个答案:

答案 0 :(得分:2)

以下应该做你想做的事:

> df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6)
> t <- table(df[,1])
> df[match(names(t[t>1]),df[,1]),]
  col1 col2
1    a    1
4    b    4

简短说明:table(...)计算每个元素在第一列中出现的次数。 names(t[t>1])仅选择出现至少两次的match(...),并public class NotificationManger { @Autowired private TaskScheduler scheduler; private ScheduledFuture<?> sc; public NotificationManger(WebSocketMessage webSocketMessage, String userName, Date date, Date time) { scheduleTask(webSocketMessage, userName, combine(date,time)); } public void scheduleTask(WebSocketMessage webSocketMessage, String userName, Date startTime) { Runnable r = new NotificationSenderTask(webSocketMessage, userName); sc = scheduler.schedule(r, new Date());//here I get a NullPointerException } } 给出所述元素的(第一个)索引。最后,选择与这些索引相对应的行。

答案 1 :(得分:2)

使用dplyr,我们可以group_by col1,然后只包含多次出现的群组,并按slice

分组获取第一行
library(dplyr)
df %>%
   group_by(col1) %>%
   filter(n() > 1) %>%
   slice(1)

#   col1  col2
#  <fctr> <int>
#1   a     1
#2   b     4

要从每个组获得第二行,我们可以

df %>%
  group_by(col1) %>%
  filter(n() > 1) %>%
  slice(2)

#    col1  col2
#    <fctr> <int>
#1      a     2
#2      b     5

我们还可以使用row_number

中的dplyr功能
df %>%
  group_by(col1) %>%
  filter(n() > 1) %>%
  filter(row_number() == 1)

答案 2 :(得分:0)

我们可以使用data.table执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),按&#39; col1&#39;分组,if行数大于1,获取第一行

library(data.table)
setDT(df)[, if(.N>1) head(.SD, 1) , col1]
#   col1 col2
#1:    a    1
#2:    b    4

如果我们需要第二个值

setDT(df)[, if(.N>1) .SD[2] , col1]
#   col1 col2
#1:    a    2
#2:    b    5

或使用dplyr

library(dplyr)
df %>%
   group_by(col1) %>%
   filter(n()>1 & row_number()==1)
#   col1  col2
#  <fctr> <int>
#1      a     1
#2      b     4