合并R中的多行

Posted

技术标签:

【中文标题】合并R中的多行【英文标题】:Merge multiple rows in R 【发布时间】:2022-01-11 21:51:33 【问题描述】:

我目前有一些数据,其中人们回答了有关行为的问题。有些问题是对过去和当前行为的总体陈述(这两个条件),而其他问题是针对特定问题框架(条件 x 和 y)而询问的有关行为的问题。

我想合并这些行,因此每个参与者有两行

一行将有他们对标记为“两者”的条件的所有答案和对条件“x”的答案 另一行将有他们对条件的所有答案都标记为“两者和对条件“y”的答案。

我尝试了几种分组解决方案,但似乎无法让它发挥作用。还看了这些答案:

Merging multiple rows into one row by several conditions in R Multiples rows to one row in R

这些都不起作用。

下面的示例代码。感谢任何帮助,因为目前我只能在 excel 中复制粘贴,这并不理想。

library(tidyverse)
a <- 
  tibble(id = c(rep(1, 3), rep(2,3), rep(3, 3)) , condition = rep(c("both", "x", "y"),3), belief = c(4.8, NA, NA, 3.2, NA, NA, 6.5, NA, NA), past = c(1.8, NA, NA, 4.8, NA, NA, 2.6, NA, NA), current= c(1.8, NA, NA, 3.8, NA, NA, 3.1, NA, NA), feel = c(NA, .6, 1, NA, 2.1, 2.3, NA, 2.6, 1.5), willing = c(NA, 3.6, 205, NA, 2.1, 2.3, NA, 1.3, 0.3))

#what my data currently looks like
a
#> # A tibble: 9 × 7
#>      id condition belief  past current  feel willing
#>   <dbl> <chr>      <dbl> <dbl>   <dbl> <dbl>   <dbl>
#> 1     1 both         4.8   1.8     1.8  NA      NA  
#> 2     1 x           NA    NA      NA     0.6     3.6
#> 3     1 y           NA    NA      NA     1     205  
#> 4     2 both         3.2   4.8     3.8  NA      NA  
#> 5     2 x           NA    NA      NA     2.1     2.1
#> 6     2 y           NA    NA      NA     2.3     2.3
#> 7     3 both         6.5   2.6     3.1  NA      NA  
#> 8     3 x           NA    NA      NA     2.6     1.3
#> 9     3 y           NA    NA      NA     1.5     0.3

b <- 
  tibble(id = c(rep(1, 2), rep(2,2), rep(3, 2)), condition = rep(c("x", "y"),3), belief = c(4.8, 4.8, 3.2, 3.2, 6.5, 6.5), past = c(1.8, 1.8, 4.8, 4.8, 2.6, 2.6), current= c(1.8, 1.8, 3.8, 3.8, 3.1, 3.1), feel = c(.6, 1,  2.1, 2.3, 2.6, 1.5), willing = c( 3.6, 205,  2.1, 2.3,  1.3, 0.3))

#what I want my data to look like
b
#> # A tibble: 6 × 7
#>      id condition belief  past current  feel willing
#>   <dbl> <chr>      <dbl> <dbl>   <dbl> <dbl>   <dbl>
#> 1     1 x            4.8   1.8     1.8   0.6     3.6
#> 2     1 y            4.8   1.8     1.8   1     205  
#> 3     2 x            3.2   4.8     3.8   2.1     2.1
#> 4     2 y            3.2   4.8     3.8   2.3     2.3
#> 5     3 x            6.5   2.6     3.1   2.6     1.3
#> 6     3 y            6.5   2.6     3.1   1.5     0.3

【问题讨论】:

【参考方案1】:

考虑由fill 组成的组,然后将filter 排除在“两者”行之外

library(dplyr)
library(tidyr)
out <- a %>%
   group_by(id) %>% 
   fill(belief:willing, .direction = "downup") %>%
   ungroup %>% 
   filter(condition != 'both')

-检查

> identical(out, b)
[1] TRUE

【讨论】:

以上是关于合并R中的多行的主要内容,如果未能解决你的问题,请参考以下文章

如何将多行合并为表中的单行

将多行合并为一列,同时用原始表中的“名称”字段替换键

将多行中的文本合并为一行(作为逗号分隔的字符串)

将一张表中的多行合并到 SQL 查询结果集中的多列中

将具有相同值的多行合并为pandas中的一行

拆分2列中的特殊字符并在oracle中合并为多行