我有调查数据,每个家庭都有一个受访者被问及每个家庭成员的年龄和教育水平。数据很广泛,因为每个家庭成员的年龄和受教育程度都有索引列。
下面是一个简单的例子:
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列)堆叠在一起,以得到如下所示的长数据集:
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执行此操作?成对的列造成了问题。
发布于 2020-03-12 08:42:01
当gather停用时,您可以使用新的pivot_longer:
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发布于 2020-03-12 08:43:44
它不是一个tidyverse解决方案,但只提一下,一种替代方法是使用data.table中的melt函数
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 6https://stackoverflow.com/questions/60646189
复制相似问题