微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在R中将逻辑数据从宽格式转换为长格式

如何解决在R中将逻辑数据从宽格式转换为长格式

我有以下数据:

ID  cancer cancer_date stroke stroke_date diabetes diabetes_date
1    1       Feb2017     0     Jan2015      1         Jun2015
2    0       Feb2014     1     Jan2015      1         Jun2015

我想得到

ID condition date
1   cancer    xx
1   diabetes  xx
2   stroke    xx
2   diabetes  xx

我尝试重塑和聚集,但没有达到我想要的效果。有什么想法我该怎么做?

解决方法

这应该做到。使其轻松工作的关键是将 environment { Cotaining_WAR_Deployment= "true" Cotaining_JAR_Deployment= "false" } cancerstroke的名称更改为diabetes,然后可以从{{1 }}做这项工作。

x_val
,

尝试使用pivot_longer()和标志变量来过滤所需状态的解决方案。旋转后,您可以过滤不为零的值,而仅选择一个值。这里的代码:

library(tidyverse)
#Code
df2 <- df %>% pivot_longer(cols = -c(ID,contains('_'))) %>%
  filter(value!=0) %>% rename(condition=name) %>% select(-value) %>%
  pivot_longer(-c(ID,condition)) %>%
  separate(name,c('v1','v2'),sep='_') %>%
  mutate(Flag=ifelse(condition==v1,1,0)) %>%
  filter(Flag==1) %>% select(-c(v1,v2,Flag)) %>%
  rename(date=value)

输出:

# A tibble: 4 x 3
     ID condition date   
  <int> <chr>     <chr>  
1     1 cancer    Feb2017
2     1 diabetes  Jun2015
3     2 stroke    Jan2015
4     2 diabetes  Jun2015

使用了一些数据:

#Data
df <- structure(list(ID = 1:2,cancer = 1:0,cancer_date = c("Feb2017","Feb2014"),stroke = 0:1,stroke_date = c("Jan2015","Jan2015"
),diabetes = c(1L,1L),diabetes_date = c("Jun2015","Jun2015"
)),class = "data.frame",row.names = c(NA,-2L))

如果第一个获取操作很复杂,那么这里是另一种选择:

#Code 2
df2 <- df %>% mutate(across(everything(),~as.character(.))) %>%
  pivot_longer(cols = -c(ID)) %>%
  separate(name,c('condition',sep = '_') %>%
  replace(is.na(.),'val') %>%
  pivot_wider(names_from = v2,values_from=value) %>%
  filter(val==1) %>% select(-val)

输出:

# A tibble: 4 x 3
  ID    condition date   
  <chr> <chr>     <chr>  
1 1     cancer    Feb2017
2 1     diabetes  Jun2015
3 2     stroke    Jan2015
4 2     diabetes  Jun2015
,
library(data.table)
data <- data.table(ID = c(1,2),cancer = c(1,0),stroke = c(0,1),"Jan2015"),diabetes = c(1,"Jun2015"))
datawide <-
  melt(data,id.vars = c("ID","cancer","stroke","diabetes"),measure.vars = c("cancer_date","stroke_date","diabetes_date"))
datawide[(cancer == 1 & variable == "cancer_date") |
           (stroke == 1 & variable == "stroke_date") |
           (diabetes == 1 & variable == "diabetes_date"),.(ID,condition = variable,date = value)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。