【问题标题】:Using the function "substr" over multiple observations in R在 R 中的多个观察值上使用函数“substr”
【发布时间】:2020-07-06 18:24:31
【问题描述】:

我有一个包含 100 个观测值和一个变量的数据集,每个观测值都是一串整数。我想从每个观察值中减去整数,并创建一个具有相同观察数但每个字符串分为几个变量的新数据框。

基本上我想从这里开始:

Variable 1
1234567
1234567
1234567

到这里

Variable 1   Variable 2   Variable 3

123             456         7
123             456         7
123             456         7

我尝试使用函数 substr 来执行此操作,但是当我将它与仅 1 个观察的子集一起使用时它可以正常工作,但当我在整个数据集上使用它时它似乎不起作用。关于如何在这里使用 substr 有什么想法,或者是否有更好的替代方法?

【问题讨论】:

  • 另一个选项是?read.fwf

标签: r


【解决方案1】:

假设您的数据集称为df,而您要拆分的列称为Var1

tidyr::separate(df, Var1, into = c("Var1", "Var2", "Var3"), sep = c(3, 6, 7))

#   Var1 Var2 Var3
# 1  123  456    7
# 2  123  456    7
# 3  123  456    7

sep 参数采用一个向量来指示要拆分的位置。

【讨论】:

    【解决方案2】:

    您可以将substrmapply 一起使用。

    dat <- cbind(dat, mapply(function(...) as.double(substr(...)), list(dat$v1), 
                             c(1, 4, 7), c(3, 6, 7)))
    dat
    #        v1          v2   1   2 3
    # 1 1234567 -0.60679296 123 456 7
    # 2 1234567 -0.06347641 123 456 7
    # 3 1234567 -0.58993170 123 456 7
    # 4 1234567 -0.71293088 123 456 7
    # 5 1234567 -0.28107903 123 456 7
    

    数据

    dat <- data.frame(v1=1234567, v2=rnorm(5))
    

    【讨论】:

      【解决方案3】:

      base R中,我们也可以用sub在指定位置创建一个分隔符,然后用read.csv可以读取它

      read.csv(text = sub("^(...)(...)(.)$", "\\1,\\2,\\3", 
           df1$Variable1), header = FALSE, col.names = paste0("Variable", 1:3))
      #  Variable1 Variable2 Variable3
      #1       123       456         7
      #2       123       456         7
      #3       123       456         7
      

      或者如cmets中提到的@markus,read.fwf可以和textConnection一起使用

      read.fwf(textConnection(paste(df1$Variable1, collapse="\n")),
               widths = c(3, 3, 1), as.is = TRUE)
      #  V1  V2 V3
      #1 123 456  7
      #2 123 456  7
      #3 123 456  7
      

      数据

      df1 <- structure(list(Variable1 = c(1234567L, 1234567L, 1234567L)), 
            class = "data.frame", row.names = c(NA, 
      -3L))     
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 2013-12-03
        • 1970-01-01
        • 2022-01-22
        • 2016-01-11
        相关资源
        最近更新 更多