将R中的两列合并为一个长列

将R中的两列合并为一个长列,r,R,我在R中有一个数据集,它有多个列,我需要它们都在同一列中 这是一个示例数据集 Net1 Net2 Net3 Net4 Net5 Net6 Net7 Net8 Net9 Net10 Net11 Net12 <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <

我在R中有一个数据集,它有多个列,我需要它们都在同一列中

这是一个示例数据集

   Net1  Net2  Net3  Net4  Net5  Net6  Net7  Net8  Net9 Net10 Net11 Net12
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <lgl>
1   -18   -30    22    27    16    47   -31    53   -10    NA NA    NA   
2    -9    53     5   -38    -3   -46    48    19   -47   -27 NA    NA  
基本上,列是同一事物的所有组。Net1+Net5+Net9都表示相同的内容,因此我需要将它们放在一列中。Net2+Net6+Net10也是如此。Net3+Net7+Net11。最后是Net4+Net8+Net12

因此,在新的数据帧中,它们应该是4列,而不是12列。这是期望的输出:

   Net1  Net2  Net3  Net4  
  <dbl> <dbl> <dbl> <dbl> 
1   -18   -30    22    27    
2    16    47    -31   53    
3   -10    NA    NA    NA    
4    -9    53     5   -38    
5    -3    -46    48   19    
6    -47  -27     NA   NA      

这里有一个不虚饰的方法:

col_mat = matrix(1:12, nrow = 4)
col_mat
#      [,1] [,2] [,3]
# [1,]    1    5    9
# [2,]    2    6   10
# [3,]    3    7   11
# [4,]    4    8   12

result = as.data.frame(apply(col_mat, 1, function(x) unlist(df[x])))
names(result) = names(df)[col_mat[, 1]]
result
#   Net1 Net2 Net3 Net4
# 1  -18  -30   22   27
# 2   -9   53    5  -38
# 3   16   47  -31   53
# 4   -3  -46   48   19
# 5  -10   NA   NA   NA
# 6  -47  -27   NA   NA
data.frame(matrix(t(df), ncol = 4, byrow = TRUE, dimnames = list(NULL, names(df)[1:4])))
#   Net1 Net2 Net3 Net4
# 1  -18  -30   22   27
# 2   16   47  -31   53
# 3  -10   NA   NA   NA
# 4   -9   53    5  -38
# 5   -3  -46   48   19
# 6  -47  -27   NA   NA
我正在使用这个示例数据-您可能需要先将逻辑列转换为数字

   df = read.table(text = 'Net1  Net2  Net3  Net4  Net5  Net6  Net7  Net8  Net9 Net10 Net11 Net12
1   -18   -30    22    27    16    47   -31    53   -10    NA NA    NA   
2    -9    53     5   -38    -3   -46    48    19   -47   -27 NA    NA  ', header = TRUE)
这里有一个整洁的方法:

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = everything()) %>%
  group_by(row = ceiling(row_number()/4)) %>%
  mutate(name = paste0('Net', 1:4)) %>%
  pivot_wider() %>%
  ungroup %>%
  select(-row)

#   Net1  Net2  Net3  Net4
#  <int> <int> <int> <int>
#1   -18   -30    22    27
#2    16    47   -31    53
#3   -10    NA    NA    NA
#4    -9    53     5   -38
#5    -3   -46    48    19
#6   -47   -27    NA    NA
这里是另一个整洁的方法


下面是一个简单的base R方法:

col_mat = matrix(1:12, nrow = 4)
col_mat
#      [,1] [,2] [,3]
# [1,]    1    5    9
# [2,]    2    6   10
# [3,]    3    7   11
# [4,]    4    8   12

result = as.data.frame(apply(col_mat, 1, function(x) unlist(df[x])))
names(result) = names(df)[col_mat[, 1]]
result
#   Net1 Net2 Net3 Net4
# 1  -18  -30   22   27
# 2   -9   53    5  -38
# 3   16   47  -31   53
# 4   -3  -46   48   19
# 5  -10   NA   NA   NA
# 6  -47  -27   NA   NA
data.frame(matrix(t(df), ncol = 4, byrow = TRUE, dimnames = list(NULL, names(df)[1:4])))
#   Net1 Net2 Net3 Net4
# 1  -18  -30   22   27
# 2   16   47  -31   53
# 3  -10   NA   NA   NA
# 4   -9   53    5  -38
# 5   -3  -46   48   19
# 6  -47  -27   NA   NA

谷歌从宽变长。实现这一点的一个R包是tidyr。
data.frame(matrix(t(df), ncol = 4, byrow = TRUE, dimnames = list(NULL, names(df)[1:4])))
#   Net1 Net2 Net3 Net4
# 1  -18  -30   22   27
# 2   16   47  -31   53
# 3  -10   NA   NA   NA
# 4   -9   53    5  -38
# 5   -3  -46   48   19
# 6  -47  -27   NA   NA