我有兩個資料框如下:
df1:
col1 <- c("Snhg6", "Mt1")
col2 <- c("Lpar6", "Nufip2")
col3 <- c("Lasp1", "Pipox")
col4 <- c("Bcam", "Rhot2")
df1 <- data.frame(col1, col2, col3, col4)
# col1 col2 col3 col4
# 1 Snhg6 Lpar6 Lasp1 Bcam
# 2 Mt1 Nufip2 Pipox Rhot2
df2:
col10 <- c("Bcam", "Rhot2", "Lpar6" , "Snhg6")
df2 <- data.frame(col10)
# col10
# 1 Bcam
# 2 Rhot2
# 3 Lpar6
# 4 Snhg6
我想以某種方式合并它們,以找出每列中有多少df1項與df2. 我想有一個輸出為:
輸出_df:
# col1 col2 col3 col4
# Snhg6 Lpar6 NA Bcam
# NA NA NA Rhot2
我嘗試使用下面的方法,但沒有一個給出預期的結果。
library(dplyr)
output_df <- df1 %>% full_join(df2)
和
library(tidyr)
output_df <- crossing(df1,df2)
如何獲得所需的輸出?謝謝。
uj5u.com熱心網友回復:
base
res <- df1
res[array(!unlist(res) %in% df2$col10, dim(res))] <- NA
res
# col1 col2 col3 col4
# 1 Snhg6 Lpar6 <NA> Bcam
# 2 <NA> <NA> <NA> Rhot2
dplyr
library(dplyr)
df1 %>%
mutate(across(everything(), ~ replace(.x, !.x %in% df2$col10, NA)))
# col1 col2 col3 col4
# 1 Snhg6 Lpar6 <NA> Bcam
# 2 <NA> <NA> <NA> Rhot2
uj5u.com熱心網友回復:
df1_mat <- as.matrix(df1)
df1_mat[!df1_mat %in% df2$col10] <- NA
as.data.frame(df1_mat)
#> col1 col2 col3 col4
#> 1 Snhg6 Lpar6 <NA> Bcam
#> 2 <NA> <NA> <NA> Rhot2
uj5u.com熱心網友回復:
另一種選擇是使用帶有wrap in的ifelse陳述句:str_detectacross
library(dplyr)
library(stringr)
pattern<- paste(df2$col10, collapse = "|")
df1 %>%
mutate(across(everything(), ~ifelse(str_detect(., pattern), ., NA_character_)))
col1 col2 col3 col4
1 Snhg6 Lpar6 <NA> Bcam
2 <NA> <NA> <NA> Rhot2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510811.html
