R 宽模型到长因子,行扩展

R 宽模型到长因子,行扩展,r,R,有许多资源用于将数据从宽数据转换为长数据,反之亦然。这里有点曲折,但如果我错过了任何现有的答案,请让我知道 问题是,我有一些行由多个标志虚拟变量表示。我不仅需要从宽到长,还需要同时复制具有多个标志的行。此外,虽然存在其他杂项数据,但没有唯一的ID,因此没有timevar或idvar 例如: 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 可以使用tid

有许多资源用于将数据从宽数据转换为长数据,反之亦然。这里有点曲折,但如果我错过了任何现有的答案,请让我知道

问题是,我有一些行由多个标志虚拟变量表示。我不仅需要从宽到长,还需要同时复制具有多个标志的行。此外,虽然存在其他杂项数据,但没有唯一的ID,因此没有timevar或idvar

例如:

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

可以使用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

可以使用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

除非我误解了您想要什么,否则您可以使用dplyr和tidyr::gather执行此操作:


我们收集除第一列(即其他_数据)之外的所有列。我们首先筛选只保留那些值为!=0,然后我们使用sub从flag中提取标志名称。最后,我们删除value列。

除非我误解了您的要求,否则您可以使用dplyr和tidyr::gather执行此操作:

我们收集除第一列(即其他_数据)之外的所有列。我们首先筛选只保留那些值为!=0,然后我们使用sub从flag中提取标志名称。最后,我们删除value列。

这里有一个base R选项来获取输出

data.frame(other_data = rep(ds[,1], rowSums(ds[-1]!=0)),
       flag = sub(".*_", "", names(ds)[-1][t(ds[-1]*col(ds[-1]))]))
#   other_data flag
#1          1    a
#2          1    c
#3          2    b
#4          3    c
这里有一个基本的R选项来获取输出

data.frame(other_data = rep(ds[,1], rowSums(ds[-1]!=0)),
       flag = sub(".*_", "", names(ds)[-1][t(ds[-1]*col(ds[-1]))]))
#   other_data flag
#1          1    a
#2          1    c
#3          2    b
#4          3    c

我认为其他_数据可以用作id变量。。?librarydata.table;meltsetDTds,id=other_data,variable.factor=FALSE[value==1,.other_data,substrvariable,ncharvariable,ncharvariable]@Frank在真实数据集中,其他数据就像是40列严重不明确的数据,就像是数百行上的4个级别因子。那还能用吗?我唯一能想到的问题是,你会临时拥有一个对象,其中的行代表所有的零,这可能会占用内存。虽然只有几百行和40面旗帜,但我想还是可以的。顺便说一句,不要单独发布,因为这只是MrFlick答案的一个不太大的变化。我认为其他的_数据可以作为id变量。。?librarydata.table;meltsetDTds,id=other_data,variable.factor=FALSE[value==1,.other_data,substrvariable,ncharvariable,ncharvariable]@Frank在真实数据集中,其他数据就像是40列严重不明确的数据,就像是数百行上的4个级别因子。那还能用吗?我唯一能想到的问题是,你会临时拥有一个对象,其中的行代表所有的零,这可能会占用内存。虽然只有几百行和40面旗帜,但我想还是可以的。顺便说一句,不要单独发布,因为这只是MrFlick答案的一个不大的变化。gather来自tidyr,而不是dplyr。gather来自tidyr,而不是dplyr。
data.frame(other_data = rep(ds[,1], rowSums(ds[-1]!=0)),
       flag = sub(".*_", "", names(ds)[-1][t(ds[-1]*col(ds[-1]))]))
#   other_data flag
#1          1    a
#2          1    c
#3          2    b
#4          3    c