从数据框中删除数据

时间:2017-12-23 09:58:50

标签: r dataframe merge

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

                  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是列&EXPANION'列的一部分,而不是一个单独的列 - 我首先需要自己制作一个列/我将如何进行此操作?

1 个答案:

答案 0 :(得分: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)CONTEXT
  3. 使用BONE
  4. keydf[, .N, key(df)]
  5. 计算行数
  6. 2次出现的子集数据(N == 2