首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将行分成两行

将行分成两行
EN

Stack Overflow用户
提问于 2022-05-09 10:57:19
回答 3查看 74关注 0票数 2

我最近在处理数据

代码语言:javascript
复制
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。

预期的结果会是这样的;

代码语言:javascript
复制
> 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-09 12:12:48

当不需要特定的订单时,可以使用repc

代码语言:javascript
复制
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

或遵守命令:

代码语言:javascript
复制
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

或者重复原始数据集并更新内容的另一个变体。

代码语言:javascript
复制
. <- 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
票数 4
EN

Stack Overflow用户

发布于 2022-05-09 12:43:41

获得结果的另一种方法是base Rtidyverse中的以下函数组合

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-05-09 12:27:23

试试这个:

代码语言:javascript
复制
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     0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72170853

复制
相关文章

相似问题

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