从数据框中删除数据[重复]

问题描述 投票:1回答:1

我有一个如下所示的数据框:

                  CEMETERY CONTEXT    SEX BONE MEASUREMENT VALUE
1 Medieval-St. Mary Graces    6225   MALE           HuE1 L  64.1
2 Medieval-St. Mary Graces    6225   MALE           HuE1 R  62.7
3 Medieval-St. Mary Graces    6225   MALE           HuHD L  50.1
4 Medieval-St. Mary Graces    6225   MALE           HuHD R  51.3
5 Medieval-St. Mary Graces    6225   MALE           HuL1 R 346.0
6 Medieval-St. Mary Graces    6272 FEMALE           HuHD L  41.3

我需要移除任何只有左(L)或(R)骨测量的样本(上下文),而不是两者(例如,如果样本有HuE1L而不是HuE1R,那么我需要将其去除)。我不确定最好的方法是什么,因为数据框太大,无法单独删除某些行。为了创建这个数据框,我使用了merge()函数,所以我也有每个骨骼的数据框(左边和右边都在不同的数据框中),如果这对我需要做的事情有什么不同?

编辑:我尝试使用data.table:

library(data.table)
setDT(df)
setkey(df, CONTEXT, BONE)
df[df[, .N, key(df)][N == 2, .(CONTEXT, BONE)]]

但是这会返回:

                     CEMETERY CONTEXT    SEX EXPANSION VALUE
  1:   Medieval-Spital Square      19 FEMALE    HuE1 L  57.9
  2:   Medieval-Spital Square      19 FEMALE    HuE1 R  58.8
  3:   Medieval-Spital Square      19 FEMALE    HuHD R  44.6
  4:   Medieval-Spital Square      19 FEMALE    HuL1 L 326.0
  5:   Medieval-Spital Square      19 FEMALE    HuL1 R 332.0

474: Medieval-St. Mary Graces   16332   MALE    RaHD L  25.4
475: Medieval-St. Mary Graces   16344   MALE    HuHD R  48.8
476: Medieval-St. Mary Graces   20001 FEMALE    HuHD L  40.2
477: Medieval-St. Mary Graces   20001 FEMALE    HuHD R  39.8
478: Medieval-St. Mary Graces   20001 FEMALE    RaHD R  20.8

所以它实际上并没有删除只有左或右的骨骼测量值。澄清一下 - Ls和Rs是“EXPANSION”列的一部分,而不是一个单独的列 - 我首先需要自己创建一个列/我将如何进行此操作?

r dataframe merge
1个回答
1
投票

您可以使用data.table对数据集进行子集化:

library(data.table)
setDT(df)
setkey(df, CONTEXT, BONE)
df[df[, .N, key(df)][N == 2, .(CONTEXT, BONE)]]

#                   CEMETERY CONTEXT  SEX BONE MEASUREMENT VALUE
# 1: Medieval-St. Mary Graces    6225 MALE HuE1           L  64.1
# 2: Medieval-St. Mary Graces    6225 MALE HuE1           R  62.7
# 3: Medieval-St. Mary Graces    6225 MALE HuHD           L  50.1
# 4: Medieval-St. Mary Graces    6225 MALE HuHD           R  51.3

说明:

  1. 将您的数据转换为data.tablesetDT()
  2. 在数据中设置键(索引)(setkey())。使用setkey(df, CONTEXT, BONE),因为我们想通过CONTEXTBONE来计算
  3. 通过key计算行数(df[, .N, key(df)]
  4. 2出现的子集数据(N == 2
© www.soinside.com 2019 - 2024. All rights reserved.