簡體   English   中英

如何根據變量名自動對變量進行層次分組

[英]How to automate hierarchical grouping of variables based on variable name

我的變量以小端方式命名,以句點分隔。

我想為每個不同的級別創建索引變量,並為每個級別的變量獲取摘要 output,但我在嘗試拆分變量並將它們放入表中以開始使用它們時遇到了第一步:

變量命名約定:

  • Environment.Construct.Subconstruct_1.subconstruct_i.#.Short_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))

我已經經歷了幾次迭代,但它仍然返回錯誤:

Error in strsplit(names, ".", fixed = TRUE) : non-character argument

而不是用as.list包裝,直接使用colnames因為根據?strsplit ,輸入x將是

x - 字符向量,其中的每個元素都將被拆分。 其他輸入,包括一個因素,將給出一個錯誤。

因此,如果它是一個list ,則它不是 strsplit 的預期輸入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"  

Output 是vectorlist OP 的帖子中並不清楚預期的 output 格式。 如果我們需要一個matrixdata.frame ,可以rbind這些list元素(假設它們具有相同的length

 m1 <-  do.call(rbind, strsplit(nm1, ".", fixed = TRUE))

返回一個matrix

或者可以使用rbind.data.frame轉換為data.frame

注意: names是 function 名稱。 最好不要給function的名字分配object的名字

更新

如果lengths不相同,一個選項是在末尾為那些length的元素填充NA

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"          

您可以計算'.'數量在列名中計算要創建的新列的數量。 然后我們可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM