存在许多资源,用于将数据从宽到长转换,反之亦然。这里有一点点扭曲,但如果我错过了任何现有的答案,请告诉我。
扭曲是我有一些由多个标志(虚拟变量)指示的行。我不仅需要从宽到长,而且要同时复制具有多个标志的行。此外,虽然还有其他杂项数据,但没有唯一的ID,因此没有" timevar"或" idvar"。
示例:
CaseDetail.CaseId
Case_Id
PtaCase.CaseDetails
ds <- data.frame(other_data=c(1,2,3),flag_a = c(1,0,0), flag_b=c(0,1,0), flag_c=c(1,0,1)) ds
答案 0 :(得分:3)
你可以使用tidyverse重塑,过滤和转换
library(tidyverse)
gather(ds, flag, present, flag_a:flag_c) %>%
filter(present>0) %>%
separate(flag, c("pre","flag")) %>%
select(-present, -pre)
导致......
# other_data flag
# 1 1 a
# 2 2 b
# 3 1 c
# 4 3 c
答案 1 :(得分:1)
除非我误解了您的需求,否则您可以使用dplyr
和tidyr::gather
执行此操作:
library(dplyr)
library(tidyr)
res <- ds %>% gather("flag","value",-1) %>%
filter(value != 0) %>%
mutate(flag=sub("flag_","",flag)) %>%
select(-value)
## other_data flag
##1 1 a
##2 2 b
##3 1 c
##4 3 c
我们gather
除第一列以外的所有列(即other_data
)。我们首先filter
仅保留value != 0
的行,然后使用flag
从sub
中提取标记名称。最后,我们删除了value
列。
答案 2 :(得分:0)
这是获取输出的<input type="range" min="0" max="100">
选项
base R