如何在R中合并行

如何在R中合并行,r,merge,R,Merge,我有一个类似这样的大数据集 ID | X2 | X3 | X4| 1 | abc| abc| abc| 1 | xyz| xyz| xyz| 2 | abc| abc| abc| 我想按id号组合这些行,就像如果它们是不同的数据帧,则使用merge,如下所示: ID | X1 | X2 | X3| X1.b| X2.b|X3.b| 1 | abc| abc| abc| xyz| xyz| xyz| 2 | abc| abc| abc| NA | NA | NA | 我尝试过重塑函数

我有一个类似这样的大数据集

ID | X2 | X3 | X4|
1  | abc| abc| abc|
1  | xyz| xyz| xyz|
2  | abc| abc| abc|
我想按id号组合这些行,就像如果它们是不同的数据帧,则使用merge,如下所示:

ID | X1 | X2 | X3| X1.b| X2.b|X3.b|
1  | abc| abc| abc| xyz| xyz| xyz|
2  | abc| abc| abc| NA | NA | NA |
我尝试过重塑函数,但它与timevar的工作方式不适合我的数据,我想

我很高兴听到别人的想法

使用dplyr和tidyr,我们可以获取长格式的数据,为每个ID和名称创建一个唯一的值,然后再次获取宽格式的数据

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -ID) %>%
  group_by(ID, name) %>%
  mutate(row = paste0(name, letters[row_number()])) %>%
  ungroup() %>%
  select(-name) %>%
  pivot_wider(names_from = row, values_from = value)

# A tibble: 2 x 7
#     ID X2a   X3a   X4a   X2b   X3b   X4b  
#  <int> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 abc   abc   abc   xyz   xyz   xyz  
#2     2 abc   abc   abc   NA    NA    NA   
资料

在按ID创建序列列之后,我们可以直接在多个列上进行透视

library(dplyr)
library(tidyr)
df1 %>% 
   group_by(ID) %>%
   mutate(rn = row_number()) %>%
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = c(X2, X3, X4), names_sep=".")
# A tibble: 2 x 7
#     ID X2.1  X2.2  X3.1  X3.2  X4.1  X4.2 
#  <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 abc   xyz   abc   xyz   abc   xyz  
#2     2 abc   <NA>  abc   <NA>  abc   <NA> 
数据
你好数据集相当大,这带来了一些问题。1制造cX2、X3等有点麻烦,因为有几十个变量。2当我尝试运行此程序时,收到错误消息vector memory耗尽code@DanBromberg在新会话中尝试使用dcast。应该更快。您可以只输入value中的名称df1[2:4],而不必键入。对不起,有这么多问题;它表示它只接受字符或NULL类型。集合中还有其他类型的数据以及日期和整数@akrun@DanBromberg取决于您使用的方法。如果它是data.table,并且您还需要其他列,那么需要在公式表达式i中处理它,即ID+somecol~rowidd
library(dplyr)
library(tidyr)
df1 %>% 
   group_by(ID) %>%
   mutate(rn = row_number()) %>%
   ungroup %>% 
   pivot_wider(names_from = rn, values_from = c(X2, X3, X4), names_sep=".")
# A tibble: 2 x 7
#     ID X2.1  X2.2  X3.1  X3.2  X4.1  X4.2 
#  <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#1     1 abc   xyz   abc   xyz   abc   xyz  
#2     2 abc   <NA>  abc   <NA>  abc   <NA> 
library(data.table)
dcast(setDT(df1), ID ~ rowid(ID), value.var = c("X2", "X3", "X4"), sep=".")
#   ID X2.1 X2.2 X3.1 X3.2 X4.1 X4.2
#1:  1  abc  xyz  abc  xyz  abc  xyz
#2:  2  abc <NA>  abc <NA>  abc <NA>
df1 <- structure(list(ID = c(1, 1, 2), X2 = c("abc", "xyz", "abc"), 
    X3 = c("abc", "xyz", "abc"), X4 = c("abc", "xyz", "abc")), class = "data.frame", row.names = c(NA, 
-3L))