使用列号在单个数据框中cbind多个单独的列

时间:2016-07-28 16:21:22

标签: r

我有一个包含100列和25行的数据框。我想在几个新数据框中绑定不同的列分组(有时多达30列),而不必每次都输入每个列名。 我想要的某些列会单独出现,例如如图6和72所示,有些人彼此相邻,例如第23,24,25,26(23:26)栏。

通常我会使用:

z <- cbind(visco$fish, visco$bird)
例如,

但是我的列数太多,需要创建太多的新数据框才能输入每次需要的每列的名称。通常我不附加我的数据。

我想使用列号,例如:

z <- cbind(6 , 72 , 23:26, data=visco) 

并保留原始列名,而不是自动生成的V1,V2。我尝试添加deparse.level = 2,但我的列名称变为&#34; visco $ fish&#34;而不是原来的&#34;鱼&#34;

我觉得应该有一个简单的答案,但到目前为止,我没有找到任何可行的方式。

4 个答案:

答案 0 :(得分:1)

 df <- data.frame(AA = 11:15, BB = 2:6, CC = 12:16, DD = 3:7, EE = 23:27)
 df
 #   AA BB CC DD EE
 # 1 11  2 12  3 23
 # 2 12  3 13  4 24
 # 3 13  4 14  5 25
 # 4 14  5 15  6 26
 # 5 15  6 16  7 27

 df1 <- data.frame(cbind(df,df,df,df))
 df1
 #   AA BB CC DD EE AA.1 BB.1 CC.1 DD.1 EE.1 AA.2 BB.2 CC.2 DD.2 EE.2 AA.3 BB.3
 # 1 11  2 12  3 23   11    2   12    3   23   11    2   12    3   23   11    2
 # 2 12  3 13  4 24   12    3   13    4   24   12    3   13    4   24   12    3
 # 3 13  4 14  5 25   13    4   14    5   25   13    4   14    5   25   13    4
 # 4 14  5 15  6 26   14    5   15    6   26   14    5   15    6   26   14    5
 # 5 15  6 16  7 27   15    6   16    7   27   15    6   16    7   27   15    6

 # CC.3 DD.3 EE.3
 # 1   12    3   23
 # 2   13    4   24
 # 3   14    5   25
 # 4   15    6   26
 # 5   16    7   27


 Result <- data.frame(cbind(df1[,c(1:5,14:17,20)]))
 Result
 #   AA BB CC DD EE DD.2 EE.2 AA.3 BB.3 EE.3
 # 1 11  2 12  3 23    3   23   11    2   23
 # 2 12  3 13  4 24    4   24   12    3   24
 # 3 13  4 14  5 25    5   25   13    4   25
 # 4 14  5 15  6 26    6   26   14    5   26
 # 5 15  6 16  7 27    7   27   15    6   27

注意:具有相同名称的列会在下一次出现时调整为.1.2由R本身调整。

答案 1 :(得分:0)

以下是如何使用select中的dplyr函数执行此操作的示例 - 这应该是您进行此类数据争论的程序包

> library(dplyr)
> df <- head(iris)
> df
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> 
>## select by variable name
>newdf <- df %>% select(Sepal.Length, Sepal.Width,Species)
> newdf
  Sepal.Length Sepal.Width Species
1          5.1         3.5  setosa
2          4.9         3.0  setosa
3          4.7         3.2  setosa
4          4.6         3.1  setosa
5          5.0         3.6  setosa
6          5.4         3.9  setosa

>## select by variable indices
> newdf <- df %>% select(1:2,5)
> newdf
  Sepal.Length Sepal.Width Species
1          5.1         3.5  setosa
2          4.9         3.0  setosa
3          4.7         3.2  setosa
4          4.6         3.1  setosa
5          5.0         3.6  setosa
6          5.4         3.9  setosa

但是,我不确定你为什么需要这样做?你能否在原始数据框上运行分析?

答案 2 :(得分:0)

我理解你的问题是将大型数据框子化为较小的数据框架。这可以通过不同的方式实现。一种方法是,data.table包可以帮助您保留列名,然后通过索引列来对其进行子集化。

如果您的数据为dataframe,则可以执行

DT<- data.table(df)
# You still have to define your subsets of columns you need to create

sub_1<-c(2,3)
sub_2<-c(2:5,9)
sub_3<-c(1:2,5:6,10)

DT[ ,sub_2, with = FALSE]

输出

  bird       cat        dog       rat        car
1: 0.2682538 0.1386834 0.01633384 0.5336649 0.43432878
2: 0.2418727 0.7530654 0.26999873 0.2679446 0.00859734
3: 0.1211858 0.2563736 0.92637523 0.8572615 0.63165705
4: 0.4556401 0.2343427 0.09324584 0.8731174 0.50098461
5: 0.1646126 0.9258622 0.86957980 0.3636781 0.89608415

数据

require("data.table")
DT <- data.table(matrix(runif(10*10),5,10)) 
colnames(DT) <- c("fish","bird","cat","dog","rat","tiger","insect","boat","car", "cycle")

答案 3 :(得分:-1)

在R中,我们有向量和矩阵。您可以使用函数c创建自己的向量。

evt

它们也是许多功能的输出,例如

c(1,5,3,4)

您可以使用rnorm(10) rbindcbind之类的函数将向量转换为矩阵。

像这样从矢量1:1000创建矩阵:

matrix

第25行第3列的条目是什么?