[英]How do I subset data table columns based on column contents rather than name in 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.