使用 R 根据名称中的特定值拆分列

问题描述 投票:0回答:1

我有这张桌子

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]
一个 两个 一个 两个
一个 两个 一个 两个
一个 两个 一个 两个
一个 两个 一个 两个
r
1个回答
0
投票

您可以通过以下方式使用

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")
© www.soinside.com 2019 - 2024. All rights reserved.