首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将虚拟变量转化为范畴变量

将虚拟变量转化为范畴变量
EN

Stack Overflow用户
提问于 2020-09-14 22:35:20
回答 3查看 389关注 0票数 0

这是我的数据

代码语言:javascript
运行
复制
data<-data.frame(
ID=c(1:8),
Diag1=c(1,0,1,0,1,0,1,0),
Diag2=c(0,1,0,1,0,0,1,0),
Diag3=c(0,0,0,1,0,1,1,0),
Multiple.Diag=c(0,0,1,1,0,0,1,0)
)

我有不同诊断的病人,其中一些有多重诊断。这些诊断是需要转换为分类变量的虚拟变量。如果病人有Mult.diag==1,他的诊断将是Multiple.diag,否则他的诊断将是Diag1Diag2Diag3。如果病人的整个变量为0,则诊断为"Other"

我想要的是:

代码语言:javascript
运行
复制
  ID     Diagnosis
1  1         Diag1
2  2         Diag2
3  3 Multiple.Diag
4  4 Multiple.Diag
5  5         Diag1
6  6         Diag3
7  7 Multiple.Diag
8  8         Other
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-14 23:07:27

使用tidyverse,您也可以这样做:

代码语言:javascript
运行
复制
data %>% 
  pivot_longer(-ID) %>%
  group_by(ID) %>%
  slice(which.max(as.integer(factor(name))*value))%>%
  mutate(name = if_else(value == 0, 'other',name), value= NULL)
 # A tibble: 8 x 2
# Groups:   ID [8]
     ID name         
  <int> <chr>        
1     1 Diag1        
2     2 Diag2        
3     3 Multiple.Diag
4     4 Multiple.Diag
5     5 Diag1        
6     6 Diag3        
7     7 Multiple.Diag
8     8 other  
票数 1
EN

Stack Overflow用户

发布于 2020-09-14 22:37:17

下面是一个带有max.col的选项,用于查找“Diag”列的每一行中值最高的列的索引,使用该索引获取列名,然后将这些元素更改为“Multiple.Diag”,如果该行中没有1,则使用用rowSums创建的逻辑表达式将其归类为“Other”

-codes

代码语言:javascript
运行
复制
out <- cbind(data['ID'], Diagnosis = names(data)[-1][
              max.col(data[startsWith(names(data), 'Diag')], 'first')])
i1 <- as.logical(data$Multiple.Diag)
out$Diagnosis[i1] <- 'Multiple.Diag'
i2 <- rowSums(data[-1]) == 0
out$Diagnosis[i2] <- 'Other'

-output

代码语言:javascript
运行
复制
out
#  ID     Diagnosis
#1  1         Diag1
#2  2         Diag2
#3  3 Multiple.Diag
#4  4 Multiple.Diag
#5  5         Diag1
#6  6         Diag3
#7  7 Multiple.Diag
#8  8         Other

max.col是矢量化的,应该非常快。

或者另一个选择是将whicharr.ind = TRUE结合使用。

代码语言:javascript
运行
复制
m1 <- which(data[-1] == 1, arr.ind = TRUE)
cbind(data['ID'], Diagnosis = ifelse(rowSums(data[-1]) == 0, 
    'Other', names(data)[-1][tapply(m1[, 2], m1[,1], FUN = max)]))

-output

代码语言:javascript
运行
复制
#  ID     Diagnosis
#1  1         Diag1
#2  2         Diag2
#3  3 Multiple.Diag
#4  4 Multiple.Diag
#5  5         Diag1
#6  6         Diag3
#7  7 Multiple.Diag
#8  8         Other

或者使用相同的方法使用tidyverse

代码语言:javascript
运行
复制
library(dplyr)
data %>% 
   transmute(ID, Diagnosis = case_when(rowSums(.[-1]) == 0 ~ "Other", 
         TRUE ~ names(.)[-1][max.col(.[-1], 'last')]))

-output

代码语言:javascript
运行
复制
#  ID     Diagnosis
#1  1         Diag1
#2  2         Diag2
#3  3 Multiple.Diag
#4  4 Multiple.Diag
#5  5         Diag1
#6  6         Diag3
#7  7 Multiple.Diag
#8  8         Other

或者使用rowwisec_across的另一个选项

代码语言:javascript
运行
复制
data %>%
   rowwise %>% 
   transmute(ID, Diagnosis = coalesce(case_when(as.logical(Multiple.Diag) 
    ~ 'Multiple.Diag',
     TRUE ~ names(.)[-1][as.logical(c_across(-1))][1] ), 'Other'))

-output

代码语言:javascript
运行
复制
# A tibble: 8 x 2
# Rowwise: 
#     ID Diagnosis    
#  <int> <chr>        
#1     1 Diag1        
#2     2 Diag2        
#3     3 Multiple.Diag
#4     4 Multiple.Diag
#5     5 Diag1        
#6     6 Diag3        
#7     7 Multiple.Diag
#8     8 Other        
票数 1
EN

Stack Overflow用户

发布于 2020-09-14 22:48:54

您可以像这样使用apply()和内置函数。您可以将结果添加到原始data或保存在新的数据格式中。函数myfunc根据您提到的方向提取用于治疗的变量的名称。在这里,代码:

代码语言:javascript
运行
复制
#Code
myfunc <- function(x)
{
  y <- names(x)[max(which(x==1))]
  if(is.na(y))
  {
    y <- 'Others'
  }
  return(y)
}
#Add var
data$Var <- apply(data[,-1],1,myfunc)

输出:

代码语言:javascript
运行
复制
  ID Diag1 Diag2 Diag3 Multiple.Diag           Var
1  1     1     0     0             0         Diag1
2  2     0     1     0             0         Diag2
3  3     1     0     0             1 Multiple.Diag
4  4     0     1     1             1 Multiple.Diag
5  5     1     0     0             0         Diag1
6  6     0     0     1             0         Diag3
7  7     1     1     1             1 Multiple.Diag
8  8     0     0     0             0        Others
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63892630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档