首页 > 解决方案 > 基于R中字符位置数字的变量名称

问题描述

我目前正在尝试根据字符串每个位置的数字更改变量名称。

variables <- c("X0.0.1", "X0.1.0", "X1.0.0", "X0.0.2", "X0.1.1", "X0.2.0", "X1.0.1", 
"X1.1.0", "X2.0.0", "X0.0.3", "X0.1.2", "X0.2.1", "X0.3.0", "X1.0.2", "X1.1.1", "X1.2.0", 
"X2.0.1","X2.1.0","X3.0.0")

理想情况下,如果该数字的位置有 2,我会有类似的东西"X0.0.1" = "x", "X0.1.0" = "y", "X1.0.0" = "z", "X0.0.2" = "xx"有没有办法快速复制变量?甚至"X3.0.0" = "zzz"

标签: rstringr

解决方案


我相信以下代码可以满足问题的要求。它用于rep获取重复,然后将paste它们放在一起。

s <- strsplit(substring(variables, 2), "\\.")
sapply(s, function(x){
  vec <- c("x", "y", "z")[seq_along(x)]
  x <- as.integer(x)
  y <- rep(vec, rev(x))
  paste(y, collapse = "")
})
# [1] "x"   "y"   "z"   "xx"  "xy"  "yy"  "xz"  "yz"  "zz"  "xxx"
#[11] "xxy" "xyy" "yyy" "xxz" "xyz" "yyz" "xzz" "yzz" "zzz"

编辑。

以下函数尝试回答评论中的对话框。它返回一个带有字符串及其度数的 data.frame。然后是排序的问题degree/chr

changeVariable <- function(x, chr = c("x", "y", "z")){
  s <- strsplit(substring(x, 2), "\\.")
  y <- lapply(s, function(.x){
    vec <- chr[seq_along(.x)]
    .x <- as.integer(.x)
    .y <- rep(vec, rev(.x))
    list(chr = paste(.y, collapse = ""),
         degree = sum(.x)
    )
  })
  res <- do.call(rbind.data.frame, y)
  row.names(res) <- NULL
  res
}

res <- changeVariable(variables)
res[order(res$degree, res$chr), ]

编辑 2。

结果粘贴有上标:

changeVariable2 <- function(x){
  s <- strsplit(substring(x, 2), "\\.")
  y <- lapply(s, function(.x){
    vec <- c("x", "y", "z")[seq_along(.x)]
    .x <- rev(as.integer(.x))
    .y <- vec[.x != 0]
    .x <- .x[.x != 0]
    list(chr = paste0(.y, "^", .x, collapse = " "),
         degree = sum(.x)
    )
  })
  res <- do.call(rbind.data.frame, y)
  row.names(res) <- NULL
  res
}

推荐阅读