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

将重复元素保留一次,并将整个数据帧保留在r中,r,dplyr,R,Dplyr,我希望基于第一列中的repeated元素删除行,但也希望保留第二列。我可以使用第二列中和repeated元素关联的任何值 输入: df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6) 预期产出: col1 col2 a 1 b 4 或者 等等 到目前为止,已尝试使用以下命令,但未保留整个数据帧: df[(duplicated(df$col1)),] 以下操作应满足您的要求: > df =

我希望基于第一列中的repeated元素删除行,但也希望保留第二列。我可以使用第二列中和repeated元素关联的任何值

输入:

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

col1 col2
a    1
b    4
或者

等等

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

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

以下操作应满足您的要求:

> 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
df=data.frame(col1=c(“a”、“a”、“a”、“b”、“b”、“c”),col2=1:6) >t df[匹配(名称(t[t>1]),df[,1]),] col1 col2 1 a 1 4 b 4
简要说明:
table(…)
统计每个元素在第一列中出现的次数<代码>名称(t[t>1])仅选择至少出现两次的名称,并且
匹配(…)
给出所述元素的(第一)索引。最后,选择与这些索引对应的行。

以下操作应满足您的要求:

> 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
df=data.frame(col1=c(“a”、“a”、“a”、“b”、“b”、“c”),col2=1:6) >t df[匹配(名称(t[t>1]),df[,1]),] col1 col2 1 a 1 4 b 4
简要说明:
table(…)
统计每个元素在第一列中出现的次数<代码>名称(t[t>1])仅选择至少出现两次的名称,并且
匹配(…)
给出所述元素的(第一)索引。最后选择与这些索引相对应的行。

我们可以使用
data.table执行此操作。将“data.frame”转换为“data.table”(
setDT(df)
),按“col1”分组,
如果行数大于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
df %>%
  group_by(col1) %>%
  filter(n() > 1) %>%
  filter(row_number() == 1)
库(dplyr)
df%>%
分组依据(col1)%>%
过滤器(n()>1&行数()==1)
#col1 col2
#   
#1 a 1
#2 b 4

我们可以使用
数据表来实现这一点。将“data.frame”转换为“data.table”(
setDT(df)
),按“col1”分组,
如果行数大于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
df %>%
  group_by(col1) %>%
  filter(n() > 1) %>%
  filter(row_number() == 1)
库(dplyr)
df%>%
分组依据(col1)%>%
过滤器(n()>1&行数()==1)
#col1 col2
#   
#1 a 1
#2 b 4

使用
dplyr
我们可以
col1
分组,然后只包括那些出现多次的组,并使用
切片

library(dplyr)
df %>%
   group_by(col1) %>%
   filter(n() > 1) %>%
   slice(1)

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

使用
dplyr
我们可以
col1
分组,然后只包括那些出现多次的组,并通过
切片获得第一行

library(dplyr)
df %>%
   group_by(col1) %>%
   filter(n() > 1) %>%
   slice(1)

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

谢谢@Jonathan,我也不想要第六排。查看我的预期输出。所以您只需要重复两次或更多次的输出?是的,完全正确@乔纳森·汉克斯@乔纳森,我也不想要第六排。查看我的预期输出。所以您只需要重复两次或更多次的输出?是的,完全正确@乔纳森