![](/img/trans.png)
[英]How to merge two dataframes in R conditionally (common column, condition)
[英]How to merge two column in a table based on certain condition in R
我在 R 中有一個這樣的表:
x Y
1 2 1
2 1 1
3 NA 1
4 2 NA
5 1 2
6 2 2
7 1 1
我希望做的是創建一個名為xy
的新列,它基於x
或y
中是否存在1
。
例如,如果x
是 1 而y
是 2 那么xy
應該是1
; 如果x
是NA
並且y
是1
那么xy
應該是1
。 如果x
和y
都是2
那么xy
應該是2
。
分類變量1
、 2
和NA
的優先級為1
> 2
> NA
。 簡而言之,我想要的輸出如下所示:
x Y XY
1 2 1 1
2 1 1 1
3 NA 1 1
4 2 NA 2
5 NA NA NA
6 2 2 2
7 1 1 1
我是 R 新手並試圖修剪我的數據。 謝謝您的幫助! 我真的很感激:)
只是一個簡單的case_when
,評論太長了。 讓我知道它是否有效:
library(dplyr)
df %>%
mutate(XY = case_when(
x == 1 | Y == 1 ~ 1,
x == 2 | Y == 2 ~ 2,
TRUE ~ NA
)
)
嘗試這個
library(dplyr)
df |> rowwise() |>
mutate(z1 = coalesce(c_across(x) , 0) , z2 = coalesce(c_across(Y) , 0)) |>
mutate(XY = case_when(any(c_across(z1:z2) == 1) ~ 1 , any(c_across(z1:z2) == 2) ~ 2)) |>
select(-z1 , -z2) |> ungroup() -> ans
# A tibble: 7 × 3
x Y XY
<int> <int> <dbl>
1 2 1 1
2 1 1 1
3 NA 1 1
4 2 NA 2
5 NA NA NA
6 2 2 2
7 1 1 1
df <- structure(list(x = c(2L, 1L, NA, 2L, NA, 2L, 1L), Y = c(1L, 1L,
1L, NA, NA, 2L, 1L)), row.names = c("1", "2", "3", "4", "5",
"6", "7"), class = "data.frame")
你可以用case_when
(記住它是從下往上評估的):
library(dplyr)
df <-
df |>
mutate(XY = case_when(x == 1 | Y == 1 ~ 1,
x == 2 | Y == 2 ~ 2,
TRUE ~ NA_real_))
或者使用base
功能應用相同的邏輯:
df$XY <- NA
df$XY[df$x == 2 | df$Y == 2] <- 2
df$XY[df$x == 1 | df$Y == 1] <- 1
輸出:
x Y XY
<dbl> <dbl> <dbl>
1 2 1 1
2 1 1 1
3 NA 1 1
4 2 NA 2
5 NA NA NA
6 2 2 2
7 1 1 1
數據:
library(readr)
df <- read_table("
x Y
2 1
1 1
NA 1
2 NA
NA NA
2 2
1 1")
這是一個基本的 R 方法。 對於每一行,檢查any
值是否為 1(刪除NA
),如果是,則將XY
的值設置為 1。然后,以類似的方式檢查any
值 2。 如果沒有找到,則設置為NA
。 如果您有更多列,則可以在函數調用中對要評估的特定列進行子集化(在本例中為x
和Y
)。
df$XY <- apply(df,
1,
function(x) {
if (any(x == 1, na.rm = T)) return(1)
if (any(x == 2, na.rm = T)) return(2)
return(NA)
})
輸出
x Y XY
1 2 1 1
2 1 1 1
3 NA 1 1
4 2 NA 2
5 NA NA NA
6 2 2 2
7 1 1 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.