如何根据列名的长度在R中对列进行子集处理?

3
我有一个数据表格,其中有一些列的名称很长,大约20个字母,比如 GTEX.12WSJ.1226.SM.5LU91。我有其他列的名称是这些名称的缩写版本,比如GTEX.12WSJ。我需要将长名称的列提取到一个单独的表中,短名称的列提取到另一个单独的表中。我想要两种类型的列出现在不同的列中,并且希望原始表基本上消失,就像rm(dt)或其他什么一样。
我该怎么做?我最接近的方法是which(nchar(names(dt)) > 9),它创建了一个数字向量,从1到符合此条件的列的数量。

4
你可以从中提取数据集 i1 <- which(nchar(names(dt)) > 9); dt[i1] - akrun
2个回答

3
您可以使用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

1
我们可以使用 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接