R 如何根据变量名自动对变量进行分层分组

R 如何根据变量名自动对变量进行分层分组,r,R,我用小端点的方式命名变量,用句点分隔 我想为每个不同的级别创建索引变量,并为每个级别的变量获取摘要输出,但我在第一步就陷入了困境,试图将我的变量分解并放在一个表中,开始使用它们: 变量命名约定: Environment.Construct.Subconstruct_1.Subconstruct_i.#.缩写_Name 例如: n <- 6 dat <- data.frame( ph1.career_interest.delight.1.Friendly=sample(1:5,

我用小端点的方式命名变量,用句点分隔

我想为每个不同的级别创建索引变量,并为每个级别的变量获取摘要输出,但我在第一步就陷入了困境,试图将我的变量分解并放在一个表中,开始使用它们:

变量命名约定:

  • Environment.Construct.Subconstruct_1.Subconstruct_i.#.缩写_Name
例如:

n <- 6
dat <- data.frame(
  ph1.career_interest.delight.1.Friendly=sample(1:5, n, replace=TRUE),
  ph1.career_interest.delight.2.Advantagious=sample(1:5, n, replace=TRUE),
  ph1.career_interest.philosophy.1.Meaningful_Difference=sample(1:5, n, replace=TRUE),
  ph1.career_interest.philosophy.2.Enable_Work=sample(1:5, n, replace=TRUE)
)

# create list of variable names
names <-  as.list(colnames( dat ))
## Try to create a heirarchy of variables: Step 1: Create matrix
heir <- as.matrix(strsplit(names,".", fixed = TRUE))

不要用
as.list
包装,直接使用
colnames
,因为根据
?strsplit
,输入
x

x-字符向量,其中每个元素都将被拆分。其他输入,包括系数,将给出一个错误

因此,如果它是
列表
,则它不是
strsplit的预期输入类

nm1 <- colnames(dat)
strsplit(nm1, ".", fixed = TRUE)
#[[1]]
#[1] "ph1"             "career_interest" "delight"         "1"               "Friendly"       

#[[2]]
#[1] "ph1"             "career_interest" "delight"         "2"               "Advantagious"   

#[[3]]
#[1] "ph1"                   "career_interest"       "philosophy"            "1"                     "Meaningful_Difference"

#[[4]]
#[1] "ph1"             "career_interest" "philosophy"      "2"               "Enable_Work"  
返回一个
矩阵

或者可以使用
rbind.data.frame

注意:
names
是一个函数名。最好不要用函数名指定对象名

更新 如果
长度
不相同,则对于长度小于
的元素,可选择在末尾填充
NA

 m1 <-  do.call(rbind, strsplit(nm1, ".", fixed = TRUE))
lst1 <- strsplit(nm1, ".", fixed = TRUE)
lst1[[1]] <- lst1[[1]][1:3] # making lengths different
mx  <- max(lengths(lst1))
do.call(rbind, lapply(lst1, `length<-`, mx))
#   [,1]  [,2]              [,3]         [,4] [,5]                   
#[1,] "ph1" "career_interest" "delight"    NA   NA                     
#[2,] "ph1" "career_interest" "delight"    "2"  "Advantagious"         
#[3,] "ph1" "career_interest" "philosophy" "1"  "Meaningful_Difference"
#[4,] "ph1" "career_interest" "philosophy" "2"  "Enable_Work"          

lst1您可以在列名中计算
”的数量。
以计算要创建的新列的数量。然后,我们可以使用
tidyr::separate
将数据划分为
n
新列,并在
上进行拆分

#Changing 1st column name to make length unequal
names(dat)[1] <- 'ph1.career_interest.delight.1'
#Number of new columns to be created
n <- max(stringr::str_count(names(dat), '\\.')) + 1
tidyr::separate(data.frame(name = names(dat)), name, 
                paste0('col', seq_len(n)), sep = '\\.', fill = 'right')

#  col1            col2       col3 col4                  col5
#1  ph1 career_interest    delight    1                  <NA>
#2  ph1 career_interest    delight    2          Advantagious
#3  ph1 career_interest philosophy    1 Meaningful_Difference
#4  ph1 career_interest philosophy    2           Enable_Work
#更改第一列名称以使长度不相等

姓名(dat)[1]谢谢!当长度相同时,效果非常好。当它们不相同时,它会给出一个错误,如您所述,“警告消息:In(function(…,deparse.level=1):结果的列数不是向量长度(arg 1)的倍数”-它看起来像是在滚动,并将最左边的值放入空格…@Josh我假设长度是相同的。如果不是,那么您是否希望在末尾为那些具有较少长度的元素填充
NA
length@Josh您可以在最后尝试使用更新的代码
#Changing 1st column name to make length unequal
names(dat)[1] <- 'ph1.career_interest.delight.1'
#Number of new columns to be created
n <- max(stringr::str_count(names(dat), '\\.')) + 1
tidyr::separate(data.frame(name = names(dat)), name, 
                paste0('col', seq_len(n)), sep = '\\.', fill = 'right')

#  col1            col2       col3 col4                  col5
#1  ph1 career_interest    delight    1                  <NA>
#2  ph1 career_interest    delight    2          Advantagious
#3  ph1 career_interest philosophy    1 Meaningful_Difference
#4  ph1 career_interest philosophy    2           Enable_Work