如何解决在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"
}
,cancer
和stroke
的名称更改为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 举报,一经查实,本站将立刻删除。