【问题标题】:R apply function on data frame columnR在数据框列上应用函数
【发布时间】:2016-02-08 13:53:03
【问题描述】:

我需要有效地解析我的数据框列之一(一个 url 字符串) 并调用一个函数(strsplit)来解析它,例如:

url <- c("www.google.com/nir1/nir2/nir3/index.asp")

unlist(strsplit(url,"/"))

我的数据框:spark.data.url.clean 看起来像这样:

                    classes              url
 [107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3

这个 df 有 100k 行,我不想循环/迭代它,分别解析每个 url 并将结果写入一个新的数据帧。 我需要/想要的是创建一个新的 5 列数据框:

df.result <- data.frame(fullurl = as.character(),baseurl=as.character(), firstlevel = as.character(), secondlevel=as.character(),thirdlevel=as.character(),classificaiton=as.character())

spark.data.url.clean$url 上调用“应用”系列函数之一 并将结果写入新数据框df.result,以便第一列(fullurl)将填充相关的spark.data.url.clean$url,第二到第五列将填充应用的相关结果

unlist(strsplit(url,"/"))

- 从结果向量中取出唯一的第一个、第二个、第三个和第四个元素并将其放入df.result 的第一、第二、第三和第四列,最后将spark.data.url.clean$classes 放入新的数据框列df.result$classificaiton

对不起,如果有什么需要进一步清理的,请告诉我。

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    据我所知,不需要apply

    试试这个:

    spark.data.url.clean <- data.frame(classes = c(107,662,685,508,111,654,509), 
      url = c("drudgereport.com/level1/level2/level3", "drudgeddddreport.com/levelfe1/lefvel2/leveel3", 
              "drudgeaasreport2.com/lefvel13/lffvel244/fel223", "otherurl.com/level1/second/level3", 
              "whateversite.com/level13/level244/level223", "esportsnow.com/first/level2/level3", 
              "reeport2.com/level13/level244/third"), stringsAsFactors = FALSE)
    
    df.result <- spark.data.url.clean
    
    names(df.result) <- c("classification", "fullurl")
    
    df.result[c("baseurl", "firstlevel", "secondlevel", "thirdlevel")] <- do.call(rbind, strsplit(df.result$fullurl, "/"))
    

    【讨论】:

      【解决方案2】:

      您可以考虑使用包splitstackshape 来执行此操作;我们可以使用它的cSplit-function。将drop 设置为F 可确保保留原始列。并不是它返回data.table,而不是data.frame

      library(splitstackshape)
      output <- cSplit(dat,2,sep="/", drop=F)
      

      使用的数据:

      dat <- data.frame(classes="[107,662,685,508,111,654,509]",
                        url="drudgereport.com/level1/level2/level3")
      

      【讨论】:

        【解决方案3】:

        这是data.table 的一个选项,它应该很快。如果您的数据如下所示:

        > df
        #                        classes                                   url
        #1 [107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3
        

        您可以执行以下操作:

        library(data.table)
        setDT(df)  # convert to data.table 
        cols <- c("baseurl", "firstlevel", "secondlevel", "thirdlevel") # define new column names
        df[, (cols) := tstrsplit(url, "/", fixed = TRUE)[1:4]]  # assign new columns
        

        现在,数据看起来像这样:

        > df
        #                         classes                                   url          baseurl firstlevel secondlevel thirdlevel
        #1: [107,662,685,508,111,654,509] drudgereport.com/level1/level2/level3 drudgereport.com     level1      level2     level3
        

        【讨论】:

          【解决方案4】:

          简单的解决方案是使用:

          apply(row, 2, function(col) {})
          

          【讨论】:

          • 这不能回答问题。
          猜你喜欢
          • 2015-09-14
          • 1970-01-01
          • 2020-10-27
          • 2015-05-14
          • 1970-01-01
          • 2021-10-09
          • 2016-07-10
          • 2021-09-03
          • 2015-04-19
          相关资源
          最近更新 更多