簡體   English   中英

在 R 中嵌套 ifelse 以跨多個列進行變異

[英]Nesting ifelse in R to mutate across multiple columns

為了簡單起見,我在 R 中對數據進行了爭論,其中包含 2 個問題和 3 個條件。 每個參與者被分配到 3 個條件中的一個,每個參與者都回答兩個問題。

當前對數據進行了組織,以便每一列包含一個條件下一個問題的答案:

Respondent.ID <- c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6", "ID7", "ID8", "ID9")
Q1.CondA <- c("Correct", "Incorrect", "I don't know", "", "", "", "", "", "")
Q1.CondB <- c("", "", "", "Incorrect", "Correct", "I don't know", "", "", "")
Q1.CondC <- c("", "", "", "", "", "", "I don't know", "Correct", "Incorrect")
Q2.CondA <- c("Incorrect", "Correct", "I don't know", "", "", "", "", "", "")
Q2.CondB <- c("", "", "", "I don't know", "Correct", "Incorrect", "", "", "")
Q2.CondC <- c("", "", "", "", "", "", "Correct", "Incorrect", "I don't know")

current<- data.frame(Respondent.ID, Q1.CondA, Q1.CondB, Q1.CondC, Q2.CondA, Q2.CondB, Q2.CondC)

我想重新組織數據,以便一列顯示分配的條件,一列顯示所有條件的問題 1 的答案,以及 1 列顯示所有條件的問題 2 的答案:

Respondent.ID <- c("ID1", "ID2", "ID3", "ID4", "ID5", "ID6", "ID7", "ID8", "ID9")
Condition <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
Q1 <- c("Correct", "Incorrect", "I don't know", "Incorrect", "Correct", "I don't know", "I don't know", 
"Correct", "Incorrect")
Q2 <- c("Incorrect", "Correct", "I don't know", "I don't know", "Correct", "Incorrect", "Correct", "Incorrect", "I don't know")
desired<- data.frame(Respondent.ID, Condition, Q1, Q2)

我可以在 Excel 中通過嵌套 If 語句(如果單元格非空白,然后復制單元格,ELSE IF 下一個單元格非空白,然后復制下一個單元格,ELSE IF...)來執行此操作。 但如果可能的話,我寧願在 R 中做所有事情。

在 Excel 中拖動復制 function 意味着我可以輸入這個單元格級別的嵌套 If 語句一次,然后它會自動更改為其他單元格。 我的實際數據集有 40 個問題、8 個條件和 800 名參與者,因此無法手動執行此操作。

在 R 中,我嘗試將 mutate() 與嵌套的 ifelse() 語句結合起來:

dplyr::mutate(current, Condition = ifelse(current$Q1.CondA != ' ', 'A', 
       ifelse(current$Q1.CondB !=' ', 'B',
              ifelse(current$Q1.CondC !=' ', 'C', ' '))))

但它只是查找列中的第一個元素,找到一個非空白,然后返回一個新的填充有“A”的“條件”列。

有沒有辦法讓它在 R 中工作以從我當前的數據幀到我想要的數據幀?

另一種方法是首先 pivot 使用tidyr表,因此除 ID 之外的所有列都聚集到一個列中。

library(tidyr)
current %>% 
  tidyr::pivot_longer(cols = -Respondent.ID)

然后可以使用".Cond"將生成的name列分為 2 列

current %>% 
  tidyr::pivot_longer(cols = -Respondent.ID) %>% 
  tidyr::separate(name, c("question_id", "condition"), sep = ".Cond")

移除空弦並旋轉更寬將產生所需的 output

current %>% 
  tidyr::pivot_longer(cols = -Respondent.ID) %>% 
  tidyr::separate(name, c("question_id", "condition"), sep = ".Cond") %>% 
  dplyr::filter(value != "") %>% 
  tidyr::pivot_wider(names_from = question_id)

暫無
暫無

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

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