如何根据列名的长度对R中的列进行子集设置?

时间:2019-12-03 14:05:23

标签: r

我有一个数据表,其中有一些列,列长约20个字母,例如GTEX.12WSJ.1226.SM.5LU91。我还有其他列,其中包含那些名称的较短,截短的版本,例如GTEX.12WSJ。我需要将长名称列从短名称列提取到单独的表中。我希望两种类型的列都存在于单独的列中,并且希望原始表基本上消失,例如rm(dt)之类。

我该怎么做?我最接近的是which(nchar(names(dt)) > 9),它创建了一个从1到适合此条件的列数的数字向量。

2 个答案:

答案 0 :(得分: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 :(得分:0)

我们可以使用创建的逻辑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)