【问题标题】:Replacing string data frame替换字符串数据框
【发布时间】:2013-09-09 14:43:07
【问题描述】:

我有一个这样的文件

1880.1.1    74
1881.1.1    74
1882.1.1    75
1883.1.1    79
1884.1.1    111
1885.1.1    145

我想创建一个这样的数据框

1880    1    1  74
1881    1    1  74
1882    1    1  75
1883    1    1  79
1884    1    1  111
1885    1    1  145

但是当我尝试使用 gsub 函数时我失败了。非常感谢!

【问题讨论】:

  • 你要逃过期,试试看:gsub("\\."," ","1880.1.1")
  • 既然你没有向我们展示你的gsub 是如何失败的,我猜你不会逃避.。它应该看起来像 gsub('\\.', ...) 但是,我不认为 gsub 是您想要的功能。相反,请查看 strsplit 并分享更多您尝试过的代码。

标签: r


【解决方案1】:

您可以使用我的“splitstackshape”包中的concat.split,以更方便的方式来做您想做的事情。假设你的data.frame 被称为“mydf”并且第一列被称为“V1”,你可以这样做:

> library(splitstackshape)
> concat.split(mydf, "V1", sep = ".", drop = TRUE)
   V2 V1_1 V1_2 V1_3
1  74 1880    1    1
2  74 1881    1    1
3  75 1882    1    1
4  79 1883    1    1
5 111 1884    1    1
6 145 1885    1    1

这里,“mydf”定义为:

mydf <- structure(list(V1 = c("1880.1.1", "1881.1.1", "1882.1.1", "1883.1.1", 
  "1884.1.1", "1885.1.1"), V2 = c(74L, 74L, 75L, 79L, 111L, 145L)), 
  .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, -6L))

base R 中的等价物是使用类似以下的内容:

> cbind(read.table(text = as.character(mydf$V1), sep = "."), mydf[-1])
    V1 V2 V3  V2
1 1880  1  1  74
2 1881  1  1  74
3 1882  1  1  75
4 1883  1  1  79
5 1884  1  1 111
6 1885  1  1 145

【讨论】:

    【解决方案2】:

    虽然 Anandas 的 R 基础解决方案更简单、更好,但这是使用 strsplit 的另一种方法

    > data.frame(t(sapply(strsplit(mydf[,"V1"], "\\." ), as.numeric)), X4=mydf[, "V2"])
        X1 X2 X3  X4
    1 1880  1  1  74
    2 1881  1  1  74
    3 1882  1  1  75
    4 1883  1  1  79
    5 1884  1  1 111
    6 1885  1  1 145
    

    【讨论】:

    • 我不知道as.numeric 会将数据强制转换为矩阵。谢谢你的课!
    • @dayne,不是as.numeric 强制转换为matrix。您可以在那里拥有几乎不会改变值的任何东西(cas.vector、...)。只是sapply 将尽可能简化为matrix(就像在这种情况下一样)。
    • @AnandaMahto 谢谢!我真的应该知道这一点。在这种情况下是sapply 还是mapply 更合适?它们的行为似乎相同,使用as.numericcbind/rbind 方法。
    • @dayne,不确定,真的。可能取决于您如何定义“更合适”:)。我不知道哪个功能更有效。我没怎么用过mapply
    【解决方案3】:

    这是strsplit 方法。我使用了@Ananda 的数据。

    > data.frame(t(mapply(cbind,strsplit(mydf[,1],split='[:.:]'))),mydf[,2])
        X1 X2 X3 mydf...2.
    1 1880  1  1        74
    2 1881  1  1        74
    3 1882  1  1        75
    4 1883  1  1        79
    5 1884  1  1       111
    6 1885  1  1       145
    

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2021-09-07
      • 2021-04-26
      相关资源
      最近更新 更多