仅保留数据框中的成对行

时间:2018-04-10 12:15:57

标签: r

从我的数据框架中,我只希望保留包含P1PN1P2PN2等所示配对样本的行。因为P和PN遵循相同的数字。在我的例子中,P3和P4没有配对样本。

      value Sample
P1    0.0000     P1
PN1   0.0000    PN1
P2    0.0000     P2
PN2   0.0000    PN2
P3    0.0000     P3
P4  384.9141     P4

      value Sample
P1    0.0000     P1
PN1   0.0000    PN1
P2    0.0000     P2
PN2   0.0000    PN2

3 个答案:

答案 0 :(得分:2)

以下是tidyverse解决方案:

我认为配对的条目总是有Sample个名称,如(P1PN1),(P2PN2)等等。

library(tidyverse);
df %>%
    mutate(id = sub("N", "", Sample)) %>%
    group_by(id) %>%
    mutate(n = n()) %>%
    filter(n == 2) %>%
    ungroup() %>%
    select(-id, -n)
## A tibble: 4 x 2
#  value Sample
#  <dbl> <fct>
#1    0. P1
#2    0. PN1
#3    0. P2
#4    0. PN2

说明:从id创建新列Sample,我们已将PN1替换为P1,依此类推;按id分组,计算每个组的行数,并且只保留每个组中2行的条目。

样本数据

df <- read.table(text =
    "      value Sample
P1    0.0000     P1
PN1   0.0000    PN1
P2    0.0000     P2
PN2   0.0000    PN2
P3    0.0000     P3
P4  384.9141     P4", header = T, row.names = 1)

答案 1 :(得分:1)

这是一个快速基础R解决方案

df[(pmax(duplicated(gsub(".*(\\d+)$", "\\1", df$Sample)), duplicated(gsub(".*(\\d+)$", "\\1", df$Sample), fromLast=TRUE))==1), ]

  # value Sample
# 1     0     P1
# 2     0    PN1
# 3     0     P2
# 4     0    PN2

数据

structure(list(value = c(0, 0, 0, 0, 0, 384.9141), Sample = structure(c(1L, 
5L, 2L, 6L, 3L, 4L), .Label = c("P1", "P2", "P3", "P4", "PN1", 
"PN2"), class = "factor")), .Names = c("value", "Sample"), class = "data.frame", row.names = c(NA, 
-6L))

答案 2 :(得分:0)

这并没有完全回答所述的问题,但似乎您的数据可以更好地存储在&#34;范围内&#34;格式。转换为广泛的df后,您可以使用complete.cases删除不存在PPN两种情况的行。

library(tidyverse)
df %>% 
  mutate(N = ifelse(grepl('N', Sample), 'PN', 'P'),
         Sample = gsub('P|PN', '', Sample)) %>% 
  spread(N, value) %>% 
  filter(complete.cases(.))

#   Sample P PN
# 1      1 0  0
# 2      2 0  0