首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tidyr堆叠家庭花名册中的多个列

如何使用tidyr堆叠家庭花名册中的多个列
EN

Stack Overflow用户
提问于 2020-03-12 08:39:18
回答 2查看 33关注 0票数 1

我有调查数据,每个家庭都有一个受访者被问及每个家庭成员的年龄和教育水平。数据很广泛,因为每个家庭成员的年龄和受教育程度都有索引列。

下面是一个简单的例子:

代码语言:javascript
复制
df <- 
  data.frame(
    HHID = 1:2,
    age_1 = c(4, 19),
    yrsedu_1 = c(8,12),    
    age_2 = c(7, 6),
    yrsedu_2 = c(14, 6)
  )

因此,age_1是家庭1中一个成员的年龄,edu_2是他们的教育水平。

从本质上讲,我希望将成对的列(每个家庭成员2列)堆叠在一起,以得到如下所示的长数据集:

代码语言:javascript
复制
  data.frame(
    HHID = c(1,1,2,2),
    hh_child_number = c(1,2,1,2),
    age = c(4,7,19,6),    
    yrsedu = c(8,14,12,6))  

如何在tidyr中使用gather执行此操作?成对的列造成了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-12 08:42:01

gather停用时,您可以使用新的pivot_longer

代码语言:javascript
复制
tidyr::pivot_longer(df, cols = -HHID, 
         names_to = c(".value", "hh_child_number"), 
         names_sep = "_") %>% type.convert(as.is = TRUE)


# A tibble: 4 x 4
#   HHID hh_child_number   age yrsedu
#  <int>           <int> <int>  <int>
#1     1               1     4      8
#2     1               2     7     14
#3     2               1    19     12
#4     2               2     6      6
票数 3
EN

Stack Overflow用户

发布于 2020-03-12 08:43:44

它不是一个tidyverse解决方案,但只提一下,一种替代方法是使用data.table中的melt函数

代码语言:javascript
复制
library(data.table)
age <- grep("age",colnames(df))
yr <- grep("yrsedu", colnames(df))

setDT(df)
melt(df, measure = list(age,yr), value.name = c("Age", "Yrsedu"), variable.name = "hh_child_number")

   HHID hh_child_number Age Yrsedu
1:    1               1   4      8
2:    2               1  19     12
3:    1               2   7     14
4:    2               2   6      6
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60646189

复制
相关文章

相似问题

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