【发布时间】:2015-04-18 22:33:23
【问题描述】:
我一直在尝试使用 gsub 将标识符键替换为边缘列表中的简单整数。边缘列表由个人和他们的连接列表(个人可变长度)组成。不幸的是,由于我的数据集超过 300K 行(因此需要 300K+ 搜索和替换操作),因此迭代地运行它需要将近一周的时间。当前代码能够产生所需的输出,但我正在尝试找到一种更有效的方法。有谁知道产生类似输出的更好方法?我当前的代码、一些假设的示例数据和示例输出如下:
样本数据:
Person Connection_list
ENJAK IDFJA, FDAKD, AODMK
JBJDF KJDFA
LAFMD JBJDF, KAOJD, ENJAK,FKJSE,IDFJA, AKSKE, FNAFJ, KJDFA, ATNFN, ADOFA, ODIJA, AODMK, NAGJA, NFAKD, FDAKD, KDSFN
ADOFA JDFKA, KAOJD, NAGJA
KJDFA ENJAK, ATNFN, NFAKD, ADOFA, AODMK, JDFKA, LAFMD, ODIJA, FNAFJ, KDSFN, JBJDF, FJKAS, FKJSE, AKSKE, NAGJA
IDFJA AKSKE, KJDFA, FJKAS, ADOFA
KDSFN KAOJD, ADOFA, AKSKE, FDAKD, NFAKD, FKJSE, NAGJA, JDFKA, ODIJA, FJKAS, ATNFN, JBJDF, FNAFJ, KJDFA, LAFMD, ENJAK
AKSKE ADOFA, ODIJA, KAOJD, JBJDF, ENJAK, AODMK, FDAKD, IDFJA, NAGJA, KJDFA
NAGJA KAOJD, AKSKE
ODIJA ADOFA, FDAKD, FKJSE, ATNFN, IDFJA, NAGJA, KAOJD
FKJSE JBJDF, NAGJA, KDSFN, KAOJD, LAFMD, KJDFA, NFAKD, FDAKD, ENJAK, ATNFN, FNAFJ, ODIJA, ADOFA, AODMK, FJKAS, AKSKE, IDFJA
FDAKD ADOFA, ODIJA, FKJSE, NAGJA, NFAKD, KJDFA, JBJDF, ATNFN, AODMK, AKSKE, KDSFN, JDFKA, LAFMD
NFAKD ADOFA, KJDFA, AKSKE, KDSFN, FJKAS, JBJDF, JDFKA
FJKAS FKJSE, AKSKE, FDAKD, NAGJA, ADOFA, ENJAK, FNAFJ, KDSFN, NFAKD, ATNFN, AODMK, KAOJD, JBJDF, JDFKA, LAFMD, IDFJA
JDFKA AKSKE, KJDFA, IDFJA
ATNFN AODMK, IDFJA, AKSKE
KAOJD ENJAK, FJKAS, FKJSE, AKSKE, NFAKD, LAFMD, JDFKA, KDSFN, ODIJA
AODMK AKSKE, FNAFJ, KAOJD, JDFKA, LAFMD, FDAKD, KDSFN, ENJAK, FJKAS, JBJDF, FKJSE, IDFJA, ATNFN
FNAFJ JBJDF, ADOFA, NFAKD, ODIJA, KAOJD, FKJSE, LAFMD, AKSKE, KDSFN, IDFJA, FNAFJ, ENJAK
当前代码:
for (i in 1:dim(data)[1]){
data$key[i] <- i
data[,2] <- gsub(data[i,1],as.character(i),data[,2])
}
期望/当前输出:
key Person Connection_list
1 ENJAK 6,12,1,18
2 JBJDF 5
3 LAFMD 2,17,3,1,11,6,8,19,5,16,4,10,18,9,13,12,7
4 ADOFA 15,17,9,4
5 KJDFA 1,5,16,13,4,18,15,3,10,19,7,2,14,11,8,9
6 IDFJA 8,5,14,4,6
7 KDSFN 17,4,8,12,13,11,9,15,7,10,14,16,2,19,5,3,1
8 AKSKE 4,10,17,2,1,18,12,6,9,5
9 NAGJA 17,8
10 ODIJA 4,12,11,16,6,9,17
11 FKJSE 2,9,7,17,3,5,13,12,11,1,16,19,10,4,18,14,8,6
12 FDAKD 4,10,11,9,12,13,5,2,16,18,8,7,15,3
13 NFAKD 4,5,8,7,14,2,15
14 FJKAS 11,8,14,12,9,4,1,19,7,13,16,18,17,2,15,3,6
15 JDFKA 8,5,15,6
16 ATNFN 16,18,6,8
17 KAOJD 1,14,11,8,13,3,15,7,10
18 AODMK 8,19,17,15,3,12,7,1,14,2,11,6,16,18
19 FNAFJ 2,4,13,10,17,11,3,8,7,6,19,1
【问题讨论】:
-
你能详细说明你想替换什么吗?也尝试这样做
apply(data,1, function(x) gsub("to.replace", "replace.with", x)) -
根据您想要的输出,
fixed=T或perl=T可能会解决问题。我通常在 15 分钟内运行 400k 行和 7000 个模式 -
请分享
dput(head(yourDataFrame))的输出以及该小样本所需的输出。 -
所以我要替换的是带有键值(又名 1:length(dataset))的人的 ID。这里的具体困难是我需要搜索和替换 300K+ 的值。
标签: r replace network-programming dataframe gsub