使用现有值名称

时间:2017-12-12 21:02:16

标签: r dataframe

我有一个数据帧
    nlmem3coef = data.frame(b0 = c(-1.453651,-1.423549,-1.497282,-1.398282,-1.453145,-1.387556,-1.415699,-1.430086), CompPlot = c("1/5/1","1/5/2","1/5/3","1/5/10","1/10/1", "1/10/2", "1/10/3", "1/10/10"))

在标题为" CompPlot"的第二列中,我只对斜杠和第二个斜杠之间的数字感兴趣。因此,我想将第二列中的值设为:

`c("5.1", "5.2", "5.3", "5.10", "10.1", "10.2", "10.3", "10.10")`

那么,有没有办法在CompPlot列中获取现有值并仅使用其中的一部分并在数字之间添加句点。其次,考虑到我在斜杠之间和斜杠之后有一个整数值,这段代码是否可以灵活地从原始数据中获得5.1和5.10以及10.1和10.10?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用sub()

sub(".*/(.+)/(.+)", "\\1.\\2", nlmem3coef$CompPlot)
# [1] "5.1"   "5.2"   "5.3"   "5.10"  "10.1"  "10.2"  "10.3"  "10.10"

正则表达式解释:

  • .*/ - 删除第一个正斜杠之前的所有内容
  • (.+) - 存储多个出现的任何字符
  • / - 匹配文字正斜杠
  • (.+) - 存储多个出现的任何字符

替换\\1.\\2获取第一个存储集.+和第二个存储集.+,并在它们之间放置.个字符。

答案 1 :(得分:0)

您可以使用IList<StudentViewmodel> students = null; using (var CTX = new StudentEntities()) { students = CTX.Students.Include("JP").Select( s => new StudentViewmodel() { Id = s.StudentId, FirstName = s.FirstName, LastName = s.LastName, address = new AddressViewmodel() { // Address1 = s.StudentAddresses.Select(t => t.Address1).ToString() Address1 = s.StudentAddresses.OfType<AddressViewmodel>().FirstOrDefault().Address1.ToString() } } ).ToList<StudentViewmodel>(); } 并捕获相关群组:

gsub

或使用gsub("\\d+/(\\d+)/(\\d+)", "\\1.\\2", nlmem3coef$CompPlot); [1] "5.1" "5.2" "5.3" "5.10" "10.1" "10.2" "10.3" "10.10"

strsplit

样本数据

sapply(strsplit(as.character(nlmem3coef$CompPlot), "/"), function(x)
    paste(x[2], x[3], sep = "."));
[1] "5.1"   "5.2"   "5.3"   "5.10"  "10.1"  "10.2"  "10.3"  "10.10"