【问题标题】:cbind multiple, individual columns in a single data frame using column numberscbind 使用列号在单个数据框中的多个单独的列
【发布时间】:2016-12-03 04:02:31
【问题描述】:

我有一个 100 列和 25 行的数据框。我想在几个新的数据框中 cbind 不同的列分组(有时多达 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 但我的列名随后变为“visco$fish”而不是原来的“fish”

我觉得应该有一个简单的答案,但到目前为止我还没有找到任何我想要的东西。

【问题讨论】:

  • 为什么不直接使用列索引呢? z &lt;- visco[, c(6,72)]
  • 你以前用过dplyr吗?您可以使用select 函数来选择您想要的变量/列,例如new_df &lt;- iris %&gt;% select(Sepal.Length, Species)
  • z
  • 我没用过dplyr,谢谢提示

标签: r


【解决方案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

注意:同名的列在下次出现时会被 R 自己调整为 .1.2

【讨论】:

  • 最后一位“data.frame(cbind(df1[,c(1:5,14:17,20)]))”这有帮助,谢谢。第一部分并不完全是我想要的,但很高兴知道。谢谢。
  • 这只是创建数据和额外的信息来理解,这样你就会知道Result 是如何出现的。 :)
【解决方案2】:

这里有一个示例,说明如何使用来自 dplyrselect 函数执行此操作 - 这应该是此类数据争论的首选包

> 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

但是,我不确定您为什么需要这样做?您不能对原始数据框进行分析吗?

【讨论】:

  • 是的,我可以对原始数据框进行分析,但对于报告,我需要更多可管理/易于阅读的用于构建某些图表的数据示例。另外,我发现它更易于使用。谢谢。
  • @Rebecca 如果我的回答有效,那么请您接受。谢谢
【解决方案3】:

我将您的问题理解为,将大型数据框细分为较小的数据框。这可以通过不同的方式实现。一种方法是,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")

【讨论】:

    【解决方案4】:

    试试这个 z

    【讨论】:

      【解决方案5】:

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

      c(1,5,3,4)
      

      它们也是许多函数的输出,例如

      rnorm(10)
      

      您可以使用rbindcbindmatrix 等函数将向量转换为矩阵。

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

      X = matrix(1:1000,100,10)
      

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

      【讨论】:

      • 如果您需要向 OP 提问,请改用评论部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2019-03-25
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多