【问题标题】:How can I make this faster? Do I need dplyr?我怎样才能让它更快?我需要 dplyr 吗?
【发布时间】:2017-08-21 21:58:23
【问题描述】:

如果没有好的大数据包,我无法执行此示例。我提供了一个简单的示例,但实际上我是针对具有超过 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] 的唯一状态。在我的真实情况下,我的状态是文字而不是数字

提前致谢

【问题讨论】:

  • 请解释您期望的结果并提供您的 3 行示例的预期结果。 c&lt;-c(1,"3_3_3_3_3_3_3") 返回一个字符向量,df&lt;-rbind(a,b,c) 创建一个字符矩阵。
  • 所以这个,df[,2] &lt;- sapply(strsplit(df[,2], '_'), function(i) paste0(unique(i), collapse = '_'))?
  • @Sotos 更改为 collapse = " " 并将其作为答案发布,以便将问题标记为已回答。
  • 预期结果是df。情况是我需要删除 df [,1] 的重复状态才能返回 df [,1] 的唯一状态。在我的真实情况下,我的状态是文字而不是数字

标签: r dplyr


【解决方案1】:

执行此操作的更 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

【讨论】:

  • 感谢您的编辑。这是更大数据框的基准吗?
  • 是的。我制作了一个更大的数据框,如下所示:df &lt;- do.call("rbind", replicate(10, df, simplify = FALSE))
猜你喜欢
  • 2012-03-23
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多