我有这张桌子
abc[1] | abc[1] | abc[2] | abc[2] | abc[3] | abc[3] | 定义[1] | 定义[1] | 定义[2] | 定义[2] | 定义[3] | 定义[3] | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 | ||||||
一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 三 | 两个 | 一个 | 三 | 两个 |
一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 | 一个 | 两个 | 三 |
它包含具有名称和括号中的数字的列,如您所见:[1]、[2]、[3].. 这只是一个数字从 1 到 3 的示例,但它可以更大,例如 100。 我想要一个脚本,它选择并放入一个新的 df 名称中包含的所有列 [1]、[2]、[3]...[n]。 我知道我可以使用 select(contains("..")) 来选择整洁的诗句,但由于括号中的数字可以在我的初始表中更改(它们可以是 1 到 3 或 1 到 100),我需要一些适用于不同的情况。 我正在考虑也许从 1:n 生成一个字符串,但问题是我的文件总是在括号 [] 中包含数字。我不能只将 contains 与数字一起使用,因为不幸的是列的名称包含字符和数字。 这就是我正在寻找的结果:
新表1
abc[1] | abc[1] | 定义[1] | 定义[1] |
---|---|---|---|
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
新表2
abc[2] | abc[2] | 定义[2] | 定义[2] |
---|---|---|---|
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
新表3
abc[3] | abc[3] | 定义[3] | 定义[3] |
---|---|---|---|
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
一个 | 两个 | 一个 | 两个 |
您可以通过以下方式使用
data.table
library(data.table)
setDT(df)
lapply(1:3, \(i) {
cols = (1:ncol(df))[grepl(paste0("\\[",i,"\\]"),names(df))]
df[,.SD, .SDcols = cols]
})
输出:
[[1]]
abc[1] abc[1] def[1] def[1]
1: One Two One Two
2: One Two One Two
3: One Two One Two
[[2]]
abc[2] abc[2] def[2] def[2]
1: Three One Three One
2: Three One Three One
3: Three One Three One
[[3]]
abc[3] abc[3] def[3] def[3]
1: Two Three Two Three
2: Two Three Two Three
3: Two Three Two Three
输入:
df = structure(list(`abc[1]` = c("One", "One", "One"), `abc[1]` = c("Two",
"Two", "Two"), `abc[2]` = c("Three", "Three", "Three"), `abc[2]` = c("One",
"One", "One"), `abc[3]` = c("Two", "Two", "Two"), `abc[3]` = c("Three",
"Three", "Three"), `def[1]` = c("One", "One", "One"), `def[1]` = c("Two",
"Two", "Two"), `def[2]` = c("Three", "Three", "Three"), `def[2]` = c("One",
"One", "One"), `def[3]` = c("Two", "Two", "Two"), `def[3]` = c("Three",
"Three", "Three")), row.names = c(NA, -3L), class = "data.frame")