我最近在处理数据
year <- c('1990', '1990', '1994', '2000', '2012')
n1 <- c(30, 70, 20, 31, 10)
n2 <- c(40, 60, 20, 21, 8)
r1 <- c(0, 9, 3, 4, 4)
r2 <- c(3, 9, 1, 2, 0)
data <- data.frame(year, n1, n2, r1, r2)我想将每一行分割成两行,其中row1包含n1和r1,row2包含n2和r2。
预期的结果会是这样的;
> data
year type n r
1 1990 0 30 0
2 1990 1 40 3
3 1990 0 70 9
4 1990 1 60 9
5 1994 0 20 3
6 1994 1 20 1
7 2000 0 31 4
8 2000 1 21 2
9 2012 0 10 4
10 2012 1 8 0发布于 2022-05-09 12:12:48
当不需要特定的订单时,可以使用rep和c。
with(data, data.frame(year, type = rep(0:1, each=length(year)),
n = c(n1, n2), r = c(r1, r2)))
# year type n r
#1 1990 0 30 0
#2 1990 0 70 9
#3 1994 0 20 3
#4 2000 0 31 4
#5 2012 0 10 4
#6 1990 1 40 3
#7 1990 1 60 9
#8 1994 1 20 1
#9 2000 1 21 2
#10 2012 1 8 0或遵守命令:
with(data, data.frame(year, type = rep(0:1, each=length(year)),
n = c(n1, n2), r = c(r1, r2))[
c(matrix(seq(1:(2*length(year))), 2, byrow=TRUE)),])
# year type n r
#1 1990 0 30 0
#6 1990 1 40 3
#2 1990 0 70 9
#7 1990 1 60 9
#3 1994 0 20 3
#8 1994 1 20 1
#4 2000 0 31 4
#9 2000 1 21 2
#5 2012 0 10 4
#10 2012 1 8 0或者重复原始数据集并更新内容的另一个变体。
. <- data[rep(seq_len(nrow(data)), each=2),]
.[c(FALSE, TRUE), c("n1", "r1")] <- .[c(TRUE, FALSE), c("n2", "r2")]
with(., data.frame(year, type = 0:1, n=n1, r=r1))
# year type n r
#1 1990 0 30 0
#2 1990 1 40 3
#3 1990 0 70 9
#4 1990 1 60 9
#5 1994 0 20 3
#6 1994 1 20 1
#7 2000 0 31 4
#8 2000 1 21 2
#9 2012 0 10 4
#10 2012 1 8 0发布于 2022-05-09 12:43:41
获得结果的另一种方法是base R和tidyverse中的以下函数组合
data %>%
reshape(direction = "long", varying = list(c("n1", "n2"), c("r1", "r2"))) %>%
select(-id) %>%
rename(type = time, n = n1, r= r1) %>%
mutate(type = if_else(type == 1, 0, 1)) %>%
`rownames<-`(1:nrow(.)) %>%
arrange(year)
year type n r
1 1990 0 30 0
2 1990 0 70 9
3 1990 1 40 3
4 1990 1 60 9
5 1994 0 20 3
6 1994 1 20 1
7 2000 0 31 4
8 2000 1 21 2
9 2012 0 10 4
10 2012 1 8 0发布于 2022-05-09 12:27:23
试试这个:
data %>%
pivot_longer(matches("\\d"),
names_to = c("prefix", "type"),
names_pattern = "(.)(.)") %>%
pivot_wider(names_from = "prefix",
values_from = "value") %>%
unnest(c(n,r))
# A tibble: 10 × 4
year type n r
<chr> <chr> <dbl> <dbl>
1 1990 1 30 0
2 1990 1 70 9
3 1990 2 40 3
4 1990 2 60 9
5 1994 1 20 3
6 1994 2 20 1
7 2000 1 31 4
8 2000 2 21 2
9 2012 1 10 4
10 2012 2 8 0https://stackoverflow.com/questions/72170853
复制相似问题