我有一个数据表,其中有一些列,列长约20个字母,例如GTEX.12WSJ.1226.SM.5LU91
。我还有其他列,其中包含那些名称的较短,截短的版本,例如GTEX.12WSJ
。我需要将长名称列从短名称列提取到单独的表中。我希望两种类型的列都存在于单独的列中,并且希望原始表基本上消失,例如rm(dt)
之类。
我该怎么做?我最接近的是which(nchar(names(dt)) > 9)
,它创建了一个从1到适合此条件的列数的数字向量。
答案 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)