簡體   English   中英

根據從不同列獲得的值創建新列,使用 R 中的 mutate() 和 case_when 函數

[英]Creating a new column based on values obtained from different column, using mutate() and case_when function in R

我是一個對 R 比較陌生的學生,並且從瀏覽這里學到了很多東西,我最近一直被困在一些事情上,經過幾個小時的嘗試仍然無法弄清楚該怎么做。 讓我們提出以下數據集:

ID Y1 Y2 Y3 Y4

1 0 0 1 1

2 0 0 0 0

3 不適用 不適用 不適用

我想創建一個新列,根據以下條件填充它:

  1. 如果該行包含 1,則無論 NA 還是 0,都返回 1
  2. 如果它包含 0 和 NA 的混合但不包含 1,則返回 0
  3. 如果只包含 NA,則返回 NA

因此,使用上面的示例,我想得到以下信息:

ID Y1 Y2 Y3 Y4 結果

1 0 0 1 1 1

2 0 0 0 0 0

3 NA NA NA NA NA

但是,我嘗試的代碼:

Data2 <- Data %>% mutate(Outcome = case_when( 
                                Data$Y1 == "na" &
                                Data$Y2 == "na" &
                                Data$Y3 == "na" &
                                Data$Y4 == "na" ~ "na"))  %>%                                
          mutate(Outcome = case_when(Data$Y1 == 1 ~ "1", 
                                 Data$Y2 == 1 ~ "1", 
                                 Data$Y3 == 1 ~ "1",
                                 Data$Y4 == 1 ~ "1",
                                 TRUE ~ "No"))

將返回:

ID Y1 Y2 Y3 Y4 結果

1 0 0 1 1 1

2 0 0 0 0 0

3 不適用 不適用 不適用 0

這似乎忽略了條件 3,如果它只包含 na,則返回 na。

任何關於我做錯了什么的指針將不勝感激。

請原諒格式,我不確定如何使它更漂亮,因為這是我第一次在這里提出問題。

提前謝謝了!

[編輯] 感謝 Shah,我注意到可能會造成混淆,對此我深表歉意。 我需要澄清一下,這只是數據集的一部分,以便理解這一點。 我正在處理一個包含更多列的大數據集,其中一些也有數值。

檢查每一列( Y1Y2Y3等)太乏味且不可擴展。 如果你有 100 列需要它,這將成為一個大問題。

如示例所示,您希望忽略第一列 ( ID ) 並在計算中包含所有其他列,您可以執行以下操作。 答案中的-1是忽略第一列ID

也可以使用is.na來比較NA值。

#Count number of non-NA values, this is used later to change the rows
#with all NA values to NA in outcome
non_NA <- rowSums(!is.na(df[-1]))
#Assign 1 if the count of 1 is greater than 0 in a row
df$Outcome <- as.integer(rowSums(df[-1], na.rm = TRUE) > 0)
#turn the outcome variable to NA for rows which has all NA values. 
df$Outcome[non_NA == 0] <- NA
df
#  ID Y1 Y2 Y3 Y4 Outcome
#1  1  0  0  1  1       1
#2  2  0  0  0  0       0
#3  3 NA NA NA NA      NA

數據

df <- structure(list(ID = 1:3, Y1 = c(0L, 0L, NA), Y2 = c(0L, 0L, NA
), Y3 = c(1L, 0L, NA), Y4 = c(1L, 0L, NA)), 
class = "data.frame", row.names = c(NA, -3L))

您可以使用dplyr rowwise函數嘗試此操作,該函數分別處理每一行

library(dplyr)

df |> rowwise() |> 
mutate(Outcome = case_when(any(c_across(Y1:Y4) == 1) ~ "1" ,
 all(is.na(c_across(Y1:Y4))) ~ NA_character_ , TRUE ~ "0"))

  • 輸出
# A tibble: 3 × 6
# Rowwise: 
     ID    Y1    Y2    Y3    Y4 Outcome
  <int> <int> <int> <int> <int> <chr>  
1     1     0     0     1     1 1      
2     2     0     0     0     0 0      
3     3    NA    NA    NA    NA NA     

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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