簡體   English   中英

如何根據列名的長度對 R 中的列進行子集化?

[英]How do I subset columns in R based on the length of the column names?

我有一個數據表,其中有一些列的名稱很長,大約 20 個字母,例如GTEX.12WSJ.1226.SM.5LU91 我還有其他列的名稱更短、截斷的版本,例如GTEX.12WSJ 我需要將長命名列從短命名列提取到單獨的表中。 我希望兩種類型的列都存在於不同的列上,並且我希望原始表基本上消失,例如rm(dt)或其他東西。

我該怎么做? 我最接近的是which(nchar(names(dt)) > 9)它創建了一個從 1 到符合此條件的列數的數字向量。

您可以使用split.default並根據字符數拆分列

list_df <- split.default(df, nchar(names(df)) > 9)

其中可以使用list_df[[1]]list_df[[2]]提取單個數據幀。

例如,在這個數據集上,我們將數據分成兩組。 一個列大於 2 個字符,另一個列小於等於 2 個字符。

df <- data.frame(abc = 1:5, ab = 1:5, a = 6:10, abcd = 11:15)
split.default(df, nchar(names(df)) > 2)

#$`FALSE`
#  ab  a
#1  1  6
#2  2  7
#3  3  8
#4  4  9
#5  5 10

#$`TRUE`
#  abc abcd
#1   1   11
#2   2   12
#3   3   13
#4   4   14
#5   5   15

我們可以使用創建的邏輯 OP 對數據進行子集化

i1 <- which(nchar(names(dt)) > 9)
dt[, i1, with = FALSE] # if it is a data.table

或者使用subset

subset(dt, select = which(nchar(names(dt)) > 9))

或者使用select

library(dplyr)
dt %>%
  select(names(dt)[nchar(names(dt))> 9])

數據

dt <- data.table(GTEX.12WSJ.1226.SM.5LU91 = 1:5, GTEX.12WSJ = 6:10, ab = 11:15)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM