隔离数据集并根据唯一列名称命名每个新数据集

时间:2016-09-28 10:43:17

标签: r

我有一个数据集(nm),如下所示:

nm

2_V2O   10_Kutti    14_DD   15_TT   16_DD   19_V2O  20_Kutti
  0        1          1       0       0       1        0
  1        1          1       1       1       0        0
  0        1          0       1       0       0        1
  0        1          1       0       1       0        0

现在我希望有多个新数据集根据其唯一列名进行隔离。还必须按照列名称创建所有数据集名称,如下所示:

Kutti   
10_Kutti    20_Kutti
   1          0
   1          0
   1          1
   1          0

V2O 
2_V2O   19_V2O
  0       1
  1       0
  0       0
  0       0

DD  
14_DD   16_DD
  1       0
  1       1
  0       0
  1       1

TT  
16_TT   
0   
1   
0   
1   

我知道这可以使用dplyr中的“select”函数来完成,但是我需要一个动态程序来自动为任何数据集构建它。

1 个答案:

答案 0 :(得分:6)

我们可以通过'nm'列名的子字符串split。删除_ sub之前的列名前缀,并将其用于split'nm'。

lst <- split.default(nm, sub(".*_", "", names(nm)))
lst
#$DD
#  14_DD 16_DD
#1     1     0
#2     1     1
#3     0     0
#4     1     1

#$Kutti
#  10_Kutti 20_Kutti
#1        1        0
#2        1        0
#3        1        1
#4        1        0

#$TT
#  15_TT
#1     0
#2     1
#3     1
#4     0

#$V2O
#  2_V2O 19_V2O
#1     0      1
#2     1      0
#3     0      0
#4     0      0

最好将data.frame保留在list中。如果我们坚持认为它应该是全局环境中的单个data.frame对象(不推荐),请使用list2env

list2env(lst, envir = .GlobalEnv)

现在,请致电

DD

数据

nm <- structure(list(`2_V2O` = c(0L, 1L, 0L, 0L), `10_Kutti` = c(1L, 
1L, 1L, 1L), `14_DD` = c(1L, 1L, 0L, 1L), `15_TT` = c(0L, 1L, 
1L, 0L), `16_DD` = c(0L, 1L, 0L, 1L), `19_V2O` = c(1L, 0L, 0L, 
0L), `20_Kutti` = c(0L, 0L, 1L, 0L)), .Names = c("2_V2O", "10_Kutti", 
"14_DD", "15_TT", "16_DD", "19_V2O", "20_Kutti"), class = "data.frame",
row.names = c(NA, -4L))