【问题标题】:Select a consecutive range of data.frame columns using names of beginning and end columns使用开始列和结束列的名称选择连续范围的 data.frame 列
【发布时间】:2016-06-05 21:24:08
【问题描述】:

我正在尝试使用列名的间隔对 data.frame 的列进行子集化。

例如,data.frameA

A
ID1 ID2 ID3
1   5  01901
2   5  01902

例如,我想用 A 的列创建变量 b:

b=A[,"ID2":"ID3"]

“ID1”中的错误:“ID3”:NA/NaN 参数另外:警告消息: 1:在[.data.frame(A, , "ID1":"ID3") 中:强制2引入的NA: 在[.data.frame(A, , "ID1":"ID3") :强制引入的NAs

我要怎么解决:

b
ID2 ID3
5  01901
5  01902

当我放置列的索引时,它可以工作。但是当我使用列名时,如上所述,不起作用。

【问题讨论】:

  • A[, c('ID2', 'ID3')]
  • 我认为这里的区别在于列范围位。如果意图跨越"IDx":"IDy",@Sotos 也是链接副本,它有点不正确
  • 我同意@Coatless 的观点,即这不是重复的,我已经编辑了问题以使其更清楚。投票重新开放。

标签: r dataframe


【解决方案1】:

base R 的data.frame 中的两种方法:

  • 命名向量列子集
  • 区间法

命名向量列子集

首先,已知名称的子集:

b = A[, c('ID2', 'ID3')]

区间法

其次,当已知列相同时,按一个区间作为子集:

# Column Variables
colvars = names(A)

# Get the first ID
start_loc = match("ID1",colvars)

# Get the second ID
end_loc = match("ID3",colvars)

# Subset range
b = A[,start_loc:end_loc]

【讨论】:

    【解决方案2】:

    如果您不限于 data.frame,您可以将其转换为 data.table,然后您的公式将起作用:

    data.table::setDT(A)[, ID2:ID3, with=F]
    
       ID2  ID3
    1:   5 1901
    2:   5 1902
    

    【讨论】:

      【解决方案3】:

      使用c() 函数,然后在使用列名时它可以工作

      > A <- data.frame(ID1=c(1,1),ID2=c(5,5),ID3=c(01901,01902))
      > A
      #   ID1 ID2  ID3
      # 1   1   5 1901
      # 2   1   5 1902
      
      > b <- A[,c(2:3)]
      > b
      #   ID2  ID3
      # 1   5 1901
      # 2   5 1902
      
      > b1 <- A[,c("ID2","ID3")]
      > b1
      #   ID2  ID3
      # 1   5 1901
      # 2   5 1902
      
      > b2 <- A[,2:3]
      > b2
      #   ID2  ID3
      # 1   5 1901
      # 2   5 1902
      

      【讨论】:

        【解决方案4】:

        您想使用列名而不是数字来选择列间隔,对吗? 为什么不:

        &gt; b &lt;- A[,c((which(colnames(A)=="ID2")):(which(colnames(A)=="ID3")))]
        &gt; b
        # ID2 ID3
        # 1 5 1901
        # 2 5 1902

        【讨论】:

          【解决方案5】:

          如果我们想使用dplyr:

          # create data frame A
          A <- data.frame (ID1 = c("1", "2"),
                       ID2 = c("5", "5"),
                       ID3 = c("01901", "01902")
                       )
          
          # print A
          A
          
          # get data frame B
          B <- A %>% select(ID2:ID3)
          
          # print B
          B
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 2019-08-22
            • 2019-10-31
            相关资源
            最近更新 更多