r - 基于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"
?
解决方案
我相信以下代码可以满足问题的要求。它用于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
}
推荐阅读
- javascript - jQuery 替换文本但不去除 HTML
- scala - 关于 option.contains() 的 Scala 问题
- angular - 为什么我不能以角度保存我的获取请求?
- python - 如何使用 Keras 进行多类分类?
- sql-server - SSMS 特定页面以及如何到达那里
- azure - Azure 数据工厂计划触发器不同的环境设置
- ios - Firebase - 删除 1 个节点的密钥会影响另一个节点的相同密钥
- swiftui - GeometryReader 和 ZStack 到产品截图
- apache-spark - 为什么我可以过滤我已经在 spark 中删除的列?
- html - Mac 和图像中文件的别名 - 如何让图像作为别名/符号链接工作?