R语言 如何查找重复项但同时考虑两列?

sulc1iza  于 2023-03-15  发布在  其他
关注(0)|答案(4)|浏览(257)

这是我的数据集示例

> head(dataset, 20)
   nquest nord tpens
1     173    1  1800
2     633    1   300
3     633    1   600
4     923    1   500
5    2886    1  1211
6    2886    2  2100
7    5416    1   700
8    7886    1  1800
9    7886    1   200
10  20297    1  1200
11  20711    2  2000
12  22169    1   600
13  22169    1   280
14  22173    2  1000
15  22276    1  1200
16  22286    1   850
17  22286    2   650
18  22657    1  1400
19  22657    2  1500
20  23490    1  1400

变量为:

  1. nquest =是个人所属的家庭的代码
  2. nord =个人在家庭中的地位(1=丈夫,2=妻子,3=儿子,等等)。
  3. tpens =是他们每个人的工资
    我需要确定对于一个特定的个体,变量tpens是否有多个值。要识别一个人,最基本的是同时考虑nquestnord,因为它们在不同的行上必须相同。

我如何计算我有多少个观测值涉及同一个个体?
我试过了

dim(dataset[duplicated(dataset$nquest & dataset$nord),])[1]

sum(duplicated(dataset$nquest & dataset$nord))

但我很确定这是错误的代码,因为他们对所有相等的nquest求和,对nord做同样的操作,实际上,当两者同时具有相同的值时,我需要求和

xurqigkl

xurqigkl1#

首先按标识观测的变量分组,然后过滤出现多次的组合:

library(tidyverse)

# define dummy data
df <- tibble::tribble(
      ~nquest, ~nord, ~tpens,
     173,    1,  1800,
     633,    1,   300,
     633,    1,   600,
     923,    1,   500,
    2886,    1,  1211,
    2886,    2,  2100,
    5416,    1,   700,
    7886,    1,  1800,
    7886,    1,   200,
   20297,    1,  1200,
   20711,    2,  2000,
   22169,    1,   600,
   22169,    1,   280,
   22173,    2,  1000,
   22276,    1,  1200,
   22286,    1,   850,
   22286,    2,   650,
   22657,    1,  1400,
   22657,    2,  1500,
   23490,    1,  1400
  )

# count combinations of nquest and nord that appear more than once
df |> 
  count(nquest, nord) |> 
  filter(n > 1)
#> # A tibble: 3 × 3
#>   nquest  nord     n
#>    <dbl> <dbl> <int>
#> 1    633     1     2
#> 2   7886     1     2
#> 3  22169     1     2

创建于2023年3月10日,使用reprex v2.0.2
一个更专业的选项是使用包管理员:

janitor::get_dupes(df, nquest, nord)
fhg3lkii

fhg3lkii2#

如果您对所有重复记录感兴趣,则可以使用

library(data.table)
setDT(df)

df[, .SD[.N > 1], .(nquest, nord)]

#    nquest nord tpens
# 1:    633    1   300
# 2:    633    1   600
# 3:   7886    1  1800
# 4:   7886    1   200
# 5:  22169    1   600
# 6:  22169    1   280

如果要删除以上所有内容

df[!df[, .SD[.N > 1], .(nquest, nord)], on = c("nquest", "nord")]

#    nquest nord tpens
# 1:    173    1  1800
# 2:    923    1   500
# 3:   2886    1  1211
# 4:   2886    2  2100
# 5:   5416    1   700
# 6:  20297    1  1200
# 7:  20711    2  2000
# 8:  22173    2  1000
# 9:  22276    1  1200
# 10:  22286    1   850
# 11:  22286    2   650
# 12:  22657    1  1400
# 13:  22657    2  1500
# 14:  23490    1  1400

更新

如果你想保留第一个副本

df[, .SD[1], .(nquest, nord)]

如果您想保留最后一个副本

df[, .SD[.N], .(nquest, nord)]
zvokhttg

zvokhttg3#

更新:如果我们希望保留唯一值,则:

df[!duplicated(df[,1:2]),]

 nquest  nord tpens
    <dbl> <dbl> <dbl>
 1    173     1  1800
 2    633     1   300
 3    923     1   500
 4   2886     1  1211
 5   2886     2  2100
 6   5416     1   700
 7   7886     1  1800
 8  20297     1  1200
 9  20711     2  2000
10  22169     1   600
11  22173     2  1000
12  22276     1  1200
13  22286     1   850
14  22286     2   650
15  22657     1  1400
16  22657     2  1500
17  23490     1  1400

如果要查找列1和列2中的重复项,则:

df[duplicated(df[,1:2]),]

输出:

nquest nord tpens
3     633    1   600
9    7886    1   200
13  22169    1   280
zpjtge22

zpjtge224#

subset(df, !(duplicated(df[1:2]) | duplicated(df[1:2], fromLast = TRUE)))

# A tibble: 14 × 3
   nquest  nord tpens
    <dbl> <dbl> <dbl>
 1    173     1  1800
 2    923     1   500
 3   2886     1  1211
 4   2886     2  2100
 5   5416     1   700
 6  20297     1  1200
 7  20711     2  2000
 8  22173     2  1000
 9  22276     1  1200
10  22286     1   850
11  22286     2   650
12  22657     1  1400
13  22657     2  1500
14  23490     1  1400

相关问题