将R中的两列合并为一个长列
我在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> <
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