从我的数据框架中,我只希望保留包含P1
和PN1
,P2
和PN2
等所示配对样本的行。因为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
答案 0 :(得分:2)
以下是tidyverse
解决方案:
我认为配对的条目总是有Sample
个名称,如(P1
,PN1
),(P2
,PN2
)等等。
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
删除不存在P
和PN
两种情况的行。
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