如何使用 R 重塑一个聚集列中的多个值列
How to reshape using R for multiple value columns across one gather column
我想使用特定的列将我的数据从宽改造成长,但要创建多个值列。下面粘贴一个例子:
data <- read.table(header=T, text='
hhid villageid hh_1 hh_2 age_1 age_2
1 10 ab pq 10 17
2 12 cd rs 11 25
3 20 ef tu 8 13
4 22 gh vw 9 3
')
#the output should gather hh_1:hh_2 to create two value columns
# hhid villageid member name age
# 1 10 hh_1 ab 10
# 1 10 hh_2 pq 17
# 2 12 hh_1 cd 11
# 2 12 hh_2 rs 25
# 3 20 hh_1 ef 8
# 3 20 hh_2 tu 13
# 4 22 hh_1 gh 9
# 4 22 hh_2 vw 3
我试过 dyplyr 包函数 gather
但没有成功。任何帮助,将不胜感激。谢谢
使用取代 gather
的 tidyr::pivot_longer
以及您可以执行的一些额外的数据整理步骤:
library(tidyr)
library(dplyr)
data %>%
pivot_longer(-c(hhid, villageid), names_to = c(".value", "member"),
names_pattern = "(.*)_(.*)") %>%
rename(name = "hh") %>%
mutate(member = paste("hh", member, sep = "_"))
#> # A tibble: 8 × 5
#> hhid villageid member name age
#> <int> <int> <chr> <chr> <int>
#> 1 1 10 hh_1 ab 10
#> 2 1 10 hh_2 pq 17
#> 3 2 12 hh_1 cd 11
#> 4 2 12 hh_2 rs 25
#> 5 3 20 hh_1 ef 8
#> 6 3 20 hh_2 tu 13
#> 7 4 22 hh_1 gh 9
#> 8 4 22 hh_2 vw 3
使用 reshape
的基础 R 选项
reshape(
data,
direction = "long",
idvar = c("hhid","villageid"),
varying = -(1:2),
sep = "_"
)
给予
hhid villageid time hh age
1.10.1 1 10 1 ab 10
2.12.1 2 12 1 cd 11
3.20.1 3 20 1 ef 8
4.22.1 4 22 1 gh 9
1.10.2 1 10 2 pq 17
2.12.2 2 12 2 rs 25
3.20.2 3 20 2 tu 13
4.22.2 4 22 2 vw 3
我想使用特定的列将我的数据从宽改造成长,但要创建多个值列。下面粘贴一个例子:
data <- read.table(header=T, text='
hhid villageid hh_1 hh_2 age_1 age_2
1 10 ab pq 10 17
2 12 cd rs 11 25
3 20 ef tu 8 13
4 22 gh vw 9 3
')
#the output should gather hh_1:hh_2 to create two value columns
# hhid villageid member name age
# 1 10 hh_1 ab 10
# 1 10 hh_2 pq 17
# 2 12 hh_1 cd 11
# 2 12 hh_2 rs 25
# 3 20 hh_1 ef 8
# 3 20 hh_2 tu 13
# 4 22 hh_1 gh 9
# 4 22 hh_2 vw 3
我试过 dyplyr 包函数 gather
但没有成功。任何帮助,将不胜感激。谢谢
使用取代 gather
的 tidyr::pivot_longer
以及您可以执行的一些额外的数据整理步骤:
library(tidyr)
library(dplyr)
data %>%
pivot_longer(-c(hhid, villageid), names_to = c(".value", "member"),
names_pattern = "(.*)_(.*)") %>%
rename(name = "hh") %>%
mutate(member = paste("hh", member, sep = "_"))
#> # A tibble: 8 × 5
#> hhid villageid member name age
#> <int> <int> <chr> <chr> <int>
#> 1 1 10 hh_1 ab 10
#> 2 1 10 hh_2 pq 17
#> 3 2 12 hh_1 cd 11
#> 4 2 12 hh_2 rs 25
#> 5 3 20 hh_1 ef 8
#> 6 3 20 hh_2 tu 13
#> 7 4 22 hh_1 gh 9
#> 8 4 22 hh_2 vw 3
使用 reshape
reshape(
data,
direction = "long",
idvar = c("hhid","villageid"),
varying = -(1:2),
sep = "_"
)
给予
hhid villageid time hh age
1.10.1 1 10 1 ab 10
2.12.1 2 12 1 cd 11
3.20.1 3 20 1 ef 8
4.22.1 4 22 1 gh 9
1.10.2 1 10 2 pq 17
2.12.2 2 12 2 rs 25
3.20.2 3 20 2 tu 13
4.22.2 4 22 2 vw 3