我怎样才能让它更快?我需要dplyr吗?

时间:2017-08-21 10:54:39

标签: r dplyr

我无法在没有大数据包的情况下执行此示例。我提供了一个简单的例子,但实际上我正在为一个超过400万行和150列的表做这件事。

library(stringr)
a<-c(1,"1_2_3_1_2_3_1")
b<-c(1,"2_2_2_3_3_3_3")
c<-c(1,"3_3_3_3_3_3_3")
df<-rbind(a,b,c)

m1<-str_split_fixed(df[,2], "_", 7)

a<-list()
for(i in 1:nrow(m1)){
  a[[i]]<-sort(unique(m1[i,]))
  df[i,2]<-paste(a[[i]],collapse=" ")}

如何让它更快?我知道dplyr可以帮助我,但我找到了基于行而非列删除的建议。

预期结果是df。情况是我需要删除df [,1]的重复状态,以便返回df [,1]的唯一状态。在我的实际情况中,我的状态是单词而不是数字

提前致谢

1 个答案:

答案 0 :(得分:2)

更多R-ish方法(而不是使用for循环)是在分割后直接在变量上使用sapply

df[,2] <- sapply(strsplit(df[,2], '_'), function(i) paste0(unique(i), collapse = '_'))

给出,

  [,1] [,2]   
a "1"  "1_2_3"
b "1"  "2_3"  
c "1"  "3"    

将这两个解决方案与microbenchmark进行比较,我们得到了:

Unit: microseconds
      expr  min     lq      mean     median  uq      max      neval
      sotos 106.635 112.794 116.3727 115.489 119.338 229.822  1000
      op    275.632 283.716 288.9455 288.336 292.185 440.010  1000