【问题标题】:Replace letter in string with names by indices用索引的名称替换字符串中的字母
【发布时间】:2021-03-16 17:20:01
【问题描述】:

我有一个带有名字的向量

nms <- LETTERS[1:10]
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"

而且我通常有一条线

rule <- "X[,3]<=-0.85 & X[,10]>-0.95 & X[,5]>0.35"

我需要将"X" 替换为具有相同索引的名称

X[,3]nms[3] ("C") ... X[,10]nms[10] ("J")

我想要得到它

"C[,3]<=-0.85 & J[,10]>-0.95 & E[,5]>0.35"

【问题讨论】:

  • 到目前为止,您为自己解决这个问题做了哪些尝试?我认为你可以使用gsub()match()for 循环来做到这一点(到目前为止,我还没有看到没有 for 循环的明显解决方法)
  • 首先,我需要从索引中提取数字.. 我尝试了 readr::parse_number , gsub, tidyr::extract_numeric ,但结果只提取了一个数字,我不太懂解析字符串,所以我马上问了我想得到什么

标签: r gsub


【解决方案1】:

不完整的答案:从

开始
r1 <- stringr::str_extract_all(rule,"\\[,([0-9]+)\\]")
n <- purrr::map_dbl(r1[[1]], readr::parse_number)

第一行提取所有括号内的表达式;第二个从每个中检索数值。

现在for 循环,每次循环使用sub 将第一个X 替换为nms 的相应元素应该可以工作。

【讨论】:

  • 能否请您完整回答所提出的主要问题
  • 堆栈溢出应该是针对特定编程问题(即“我需要完成任务 X 并且我被困在子任务 Y”),而不是“可以有人请写代码为我解决以下问题”。我很感激没有得到完整的答案让你感到沮丧(你可以随意否决我的答案),但我正在回应你在 cmets 中提到的具体问题。 (我也投票结束,因为“需要更多关注”,即“请重写问题以关注特定问题”。)
【解决方案2】:

我确信可以让它更简洁,但我不知道如何

nms <- LETTERS[1:10]
 rule <- "X[,3]<=-0.85 & X[,10]>-0.95 & X[,5]>0.35"
 
 r1 <- stringr::str_extract_all(rule,"\\[,([0-9]+)\\]")
 n <- purrr::map_dbl(r1[[1]], readr::parse_number)
 idx <- gregexpr(pattern ='X',rule)[[1]]
 for(i in 1:length(n))   substr(rule, idx[i], idx[i]) <- nms[n[i]]
 
 rule
[1] "C[,3]<=-0.85 & J[,10]>-0.95 & E[,5]>0.35"

【讨论】:

  • 欢迎您接受自己的答案作为最佳解决方案;你不必接受我的。
  • 你的回答对我更有帮助))谢谢,现在我会更周到地提出我的问题
  • FWIW 我可以看到解决此问题的其他方法,但不一定是更简洁的方法。
  • 如果你分享我会很高兴
猜你喜欢
  • 2021-03-10
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2022-06-22
  • 2011-10-20
相关资源
最近更新 更多