基于多列中存在的字符串的子集 table
Subset table based on strings present in multiple columns
我有一个看起来像这样的数据框
> df
Col1 Col2 P_value
Cell1 Cell2 0.001
Cell2 Cell1 0.05
Cell4 Cell1 0.01
Cell5 Cell2 0.03
Cell2 Cell3 0.008
Cell1 Cell4 0.008
我想子集到一个新的数据框,其中只有字符串同时出现在 Col1
和 Col2
中。所以在这里,Cell1
和 Cell2
,当匹配时,出现在 Col1 和 Col2 中。
> df
Col1 Col2 P_value
Cell1 Cell2 0.001
Cell2 Cell1 0.05
Cell1 Cell4 0.008
Cell4 Cell1 0.01
所以在这里,Cell1
和 Cell2
在匹配时出现在 Col1 和 Col2 中。 Cell1 和 Cell4 相同。其他字符串永远不会发生这种情况。
我们可以使用
library(dplyr)
library(stringr)
df %>%
mutate(Col = str_c(pmin(Col1, Col2), pmax(Col1, Col2))) %>%
filter(duplicated(Col)|duplicated(Col, fromLast = TRUE)) %>%
select(-Col)
或者可以
df %>%
add_count(pmin(Col1, Col2), pmax(Col1, Col2)) %>%
filter(n > 1) %>%
select(names(df))
-输出
Col1 Col2 P_value
1 Cell1 Cell2 <0.05
2 Cell2 Cell1 <0.05
3 Cell4 Cell1 <0.05
4 Cell1 Cell4 <0.05
数据
df <- structure(list(Col1 = c("Cell1", "Cell2", "Cell4", "Cell5", "Cell2",
"Cell1"), Col2 = c("Cell2", "Cell1", "Cell1", "Cell2", "Cell3",
"Cell4"), P_value = c("<0.05", "<0.05", "<0.05", "<0.05", "<0.05",
"<0.05")), class = "data.frame", row.names = c(NA, -6L))
也许这是over-simplifying,但是...
df %>%
filter(Col1 %in% Col2 & Col2 %in% Col1)
# Col1 Col2 P_value
# 1 Cell1 Cell2 <0.05
# 2 Cell2 Cell1 <0.05
# 3 Cell4 Cell1 <0.05
# 4 Cell1 Cell4 <0.05
可能的解决方案,基于inner_join
:
library(dplyr)
inner_join(df, df[-3], by = c("Col2" = "Col1", "Col1" = "Col2"))
#> Col1 Col2 P_value
#> 1 Cell1 Cell2 0.001
#> 2 Cell2 Cell1 0.050
#> 3 Cell4 Cell1 0.010
#> 4 Cell1 Cell4 0.008
我有一个看起来像这样的数据框
> df
Col1 Col2 P_value
Cell1 Cell2 0.001
Cell2 Cell1 0.05
Cell4 Cell1 0.01
Cell5 Cell2 0.03
Cell2 Cell3 0.008
Cell1 Cell4 0.008
我想子集到一个新的数据框,其中只有字符串同时出现在 Col1
和 Col2
中。所以在这里,Cell1
和 Cell2
,当匹配时,出现在 Col1 和 Col2 中。
> df
Col1 Col2 P_value
Cell1 Cell2 0.001
Cell2 Cell1 0.05
Cell1 Cell4 0.008
Cell4 Cell1 0.01
所以在这里,Cell1
和 Cell2
在匹配时出现在 Col1 和 Col2 中。 Cell1 和 Cell4 相同。其他字符串永远不会发生这种情况。
我们可以使用
library(dplyr)
library(stringr)
df %>%
mutate(Col = str_c(pmin(Col1, Col2), pmax(Col1, Col2))) %>%
filter(duplicated(Col)|duplicated(Col, fromLast = TRUE)) %>%
select(-Col)
或者可以
df %>%
add_count(pmin(Col1, Col2), pmax(Col1, Col2)) %>%
filter(n > 1) %>%
select(names(df))
-输出
Col1 Col2 P_value
1 Cell1 Cell2 <0.05
2 Cell2 Cell1 <0.05
3 Cell4 Cell1 <0.05
4 Cell1 Cell4 <0.05
数据
df <- structure(list(Col1 = c("Cell1", "Cell2", "Cell4", "Cell5", "Cell2",
"Cell1"), Col2 = c("Cell2", "Cell1", "Cell1", "Cell2", "Cell3",
"Cell4"), P_value = c("<0.05", "<0.05", "<0.05", "<0.05", "<0.05",
"<0.05")), class = "data.frame", row.names = c(NA, -6L))
也许这是over-simplifying,但是...
df %>%
filter(Col1 %in% Col2 & Col2 %in% Col1)
# Col1 Col2 P_value
# 1 Cell1 Cell2 <0.05
# 2 Cell2 Cell1 <0.05
# 3 Cell4 Cell1 <0.05
# 4 Cell1 Cell4 <0.05
可能的解决方案,基于inner_join
:
library(dplyr)
inner_join(df, df[-3], by = c("Col2" = "Col1", "Col1" = "Col2"))
#> Col1 Col2 P_value
#> 1 Cell1 Cell2 0.001
#> 2 Cell2 Cell1 0.050
#> 3 Cell4 Cell1 0.010
#> 4 Cell1 Cell4 0.008