我正在處理調查資料,我需要確定回應是否不適用或只是被跳過。
x1并且x2是我的主要回答問題。x1x3 僅在有人指出是否適用且不x2適用時才填寫。- 我希望第 1 行和第 2 行等于 0
x1并且x2不適用,并且我希望第 4 行等于 1x1并且x2正確報告為“以上都不是”。 - 第 3 行是真正缺失的觀察結果,因為
x1,x2或x3都沒有得到回答。
我下面的代碼有效,但是有沒有更簡單的方法可以讓我只參考我的變數而不是使用andlist撰寫冗長的 AND 陳述句?x1x2我已經簡化了這個例子,因為我的完整資料集有 10 多個x變數。
library(dplyr)
df3 <- tibble(x1 = c("Yes", "No", NA, NA), x2 = c("Yes", "Yes", NA, NA), x3 = c(NA, NA, NA, "None of the above"))
list <- c("x1", "x2")
df3 %>%
mutate(
x3 = coalesce(as.integer(x3 == "None of the above"), 0),
x3 = case_when(
x3 == 1 ~ 1,
is.na(x1) & is.na(x2) ~ NA_real_,
TRUE ~ 0))
uj5u.com熱心網友回復:
最小的修訂是替換is.na(x1) & is.na(x2)為if_all(..., is.na),即
df3 %>%
mutate(
x3 = coalesce(as.integer(x3 == "None of the above"), 0),
x3 = case_when(
x3 == 1 ~ 1,
if_all(all_of(list), is.na) ~ NA_real_,
TRUE ~ 0))
使用if_all(),您甚至不需要參考list變數,只需傳遞一個簡單的tidy-select幫助器,例如
if_all(x1:x2, is.na)(這種方式x1&x2必須是連續的列)if_all(starts_with("x"), is.na)if_all(num_range("x", 1:2), is.na)
uj5u.com熱心網友回復:
這是一個想法。我們可以使用all_of,select根據target向量選擇列(我在 R 中改為listastarget函式list),然后使用is.naandrowSums評估所有列是否為NA。我們可以將此策略與case_when創建x3列相結合。
library(dplyr)
target <- c("x1", "x2")
df3 %>%
mutate(
x3 = case_when(
rowSums(is.na(select(., all_of(target)))) == 0 ~0L,
rowSums(is.na(select(., all_of(target)))) != 0 & !is.na(x3) ~1L,
TRUE ~NA_integer_
),
)
# # A tibble: 4 × 3
# x1 x2 x3
# <chr> <chr> <int>
# 1 Yes Yes 0
# 2 No Yes 0
# 3 NA NA NA
# 4 NA NA 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/489748.html
上一篇:Pandas-ApplyMap使用來自兩個不同DataFrame的相應單元格值
下一篇:(TypeError:預期的字串或類似位元組的物件)為什么如果我的變數存盤了我的資料(字串),它們會顯示為不同的型別?
