我想根据第一列中的重复元素删除行,但也希望保留第二列。我可以使用第二列中与重复元素相关的任何值。
输入:
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)),]
答案 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