簡體   English   中英

如何根據R中的特定條件合並表中的兩列

[英]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的新列,它基於xy中是否存在1

例如,如果x是 1 而y是 2 那么xy應該是1 如果xNA並且y1那么xy應該是1 如果xy都是2那么xy應該是2

分類變量12NA的優先級為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 如果您有更多列,則可以在函數調用中對要評估的特定列進行子集化(在本例中為xY )。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM