簡體   English   中英

R - 將各種虛擬/邏輯變量從其名稱轉換為單個分類變量/因子

[英]R - Convert various dummy/logical variables into a single categorical variable/factor from their name

我的問題與這個另一個問題有很大的相似之處,但我的數據集有點不同,我似乎無法使這些解決方案有效。 如果我誤解了什么,請原諒我,這個問題是多余的。

我有一個這樣的數據集:

df <- data.frame(
  id = c(1:5),
  conditionA = c(1, NA, NA, NA, 1),
  conditionB = c(NA, 1, NA, NA, NA),
  conditionC = c(NA, NA, 1, NA, NA),
  conditionD = c(NA, NA, NA, 1, NA)
  )
# id conditionA conditionB conditionC conditionD
# 1  1          1         NA         NA         NA
# 2  2         NA          1         NA         NA
# 3  3         NA         NA          1         NA
# 4  4         NA         NA         NA          1
# 5  5          1         NA         NA         NA

(請注意,除了這些列之外,我還有很多其他列不應受當前操作的影響。)

因此,我觀察到conditionAconditionBconditionCconditionD D是相互排斥的,應該更好地表示為單個分類變量,即factor ,應該如下所示:

#   id       type
# 1  1 conditionA
# 2  2 conditionB
# 3  3 conditionC
# 4  4 conditionD
# 5  5 conditionA

我已經使用tidyr gatherunitetidyr ,但它與這種情況不符(有unite ,我們會丟失變量名稱中的信息)。

我嘗試使用kimisc::coalescence.na ,如第一個提到的答案中所建議的,但是1.我首先需要根據每列的名稱設置一個因子值,2。它不能按預期工作,只包括第一欄:

library(kimisc)
# first, factor each condition with a specific label
df$conditionA <- df$conditionA %>%
  factor(levels = 1, labels = "conditionA")
df$conditionB <- df$conditionB %>%
  factor(levels = 1, labels = "conditionB")
df$conditionC <- df$conditionC %>%
  factor(levels = 1, labels = "conditionC")
df$conditionD <- df$conditionD %>%
  factor(levels = 1, labels = "conditionD")

# now coalesce.na to merge into a single variable
df$type <- coalesce.na(df$conditionA, df$conditionB, df$conditionC, df$conditionD)

df
#   id conditionA conditionB conditionC conditionD       type
# 1  1 conditionA       <NA>       <NA>       <NA> conditionA 
# 2  2       <NA> conditionB       <NA>       <NA>       <NA> 
# 3  3       <NA>       <NA> conditionC       <NA>       <NA> 
# 4  4       <NA>       <NA>       <NA> conditionD       <NA> 
# 5  5 conditionA       <NA>       <NA>       <NA> conditionA

我嘗試了第二個問題中的其他建議,但沒有找到一個會給我帶來預期結果的建議......

嘗試:

library(dplyr)
library(tidyr)

df %>% gather(type, value, -id) %>% na.omit() %>% select(-value) %>% arrange(id)

這使:

#  id       type
#1  1 conditionA
#2  2 conditionB
#3  3 conditionC
#4  4 conditionD
#5  5 conditionA

更新

要處理您在注釋中詳細說明的情況,您可以對數據框的所需部分執行操作,然后left_join()執行其他列:

df %>% 
  select(starts_with("condition"), id) %>% 
  gather(type, value, -id) %>% 
  na.omit() %>% 
  select(-value) %>% 
  left_join(., df %>% select(-starts_with("condition"))) %>%
  arrange(id)

你也可以嘗試:

colnames(df)[2:5][max.col(!is.na(df[,2:5]))]
#[1] "conditionA" "conditionB" "conditionC" "conditionD" "conditionA"

如果每行只有一列的值不是NA ,則上述方法有效。 如果一行的值可以全部為NA ,那么您可以嘗試:

mat<-!is.na(df[,2:5])
colnames(df)[2:5][max.col(mat)*(NA^!rowSums(mat))]
library(tidyr)
library(dplyr)

df <- df %>%
  gather(type, count, -id)
df <- df[complete.cases(df),][,-3]
df[order(df$id),]
   id       type
1   1 conditionA
7   2 conditionB
13  3 conditionC
19  4 conditionD
5   5 conditionA

暫無
暫無

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

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