我无法在没有大数据包的情况下执行此示例。我提供了一个简单的例子,但实际上我正在为一个超过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]的唯一状态。在我的实际情况中,我的状态是单词而不是数字
提前致谢
答案 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