[英]making trigrams from a dataframe in R
我想在第二列與數據幀的第一列中找到匹配的元素,並使用匹配的元素作為三元組的中間元素來創建三元組。 在不匹配的情況下,trigram的中間和最后一個元素將是不匹配的第二列元素。 這是一個例子:
gdf <- data.frame(from=c(1,2,3,4,5),to=c(2,3,1,5,6),stringsAsFactors=FALSE)
gdf
# from to
# 1 2
# 2 3
# 3 1
# 4 5
# 5 6
輸出三元組如下:
from middle to
1 2 3
2 3 1
3 1 2
4 5 6
5 6 6
我的for循環代碼需要很長時間才能處理龐大的數據集。我的數據集有54304行。
這是我寫的:
num <- nrow(gdf)
df2 <- data.frame(from=character(0),middle=character(0),to=character(0),stringsAsFactors=FALSE)
count <- rep(0,nrow(gdf))
for(row in 1:nrow(gdf)){
for(rowc in 1:nrow(gdf)){
if(gdf[rowc,]$from==gdf[row,]$to){
df2[nrow(df2)+1,]<-c(gdf[row,]$from,gdf[row,]$to,gdf[rowc,]$to)
count[row]<-row
}
}
if(count[row]==0){
df2[nrow(df2)+1,]<-c(gdf[row,]$from,gdf[row,]$to,gdf[row,]$to)
}
}
任何幫助將不勝感激!
不知道您的示例是否太簡單以至於無法在實際數據集中使用,但是簡單的合並適用於該示例,然后我對列進行排序以使它們按順序退回,因為合並將您合並的列作為列1。
Merged <- merge(gdf,gdf,by.x="to",by.y="from")[,c(2,1,3)]
然后,您可以稍后使用行綁定添加nomatch元素
rbind(Merged,gdf[! paste(gdf[,1],gdf[,2]) %in% paste(Merged[,1],Merged[,2]),][,c(1,2,2)])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.