9

我的问题与这个问题和另一个问题有很大的相似之处,但我的数据集有点不同,我似乎无法让这些解决方案发挥作用。如果我误解了什么并且这个问题是多余的,请原谅我。

我有一个这样的数据集:

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

(请注意,除了这些列之外,我还有很多其他列不应受到当前操作的影响。)

因此,我观察到conditionA、和是互斥的,应该更好地表示为单个分类变量,即conditionB应该如下所示:conditionCconditionDfactor

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

我已经使用gatheror unitefrom进行了调查tidyr,但它与这种情况不对应(使用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

我尝试了第二个问题的其他建议,但还没有找到一个能给我带来预期结果的建议......

4

3 回答 3

7

尝试:

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)
于 2015-05-19T19:00:05.687 回答
5

你也可以试试:

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

如果只有一列具有除NA每一行以外的值,则上述方法有效。如果一行的值可以都是NAs,那么你可以试试:

mat<-!is.na(df[,2:5])
colnames(df)[2:5][max.col(mat)*(NA^!rowSums(mat))]
于 2015-05-19T18:56:30.647 回答
1
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
于 2015-05-19T18:51:33.077 回答