[英]Merging two data.frames with numbers and characters in same column in r
我有兩個數據框。 一個是帶有相應編號的單詞庫。 另一個是一個問題,我有3個。我的原始數據在庫中有200萬行,還有100萬個問題。 至於為什么在列中使用for循環。 我的問題是,為什么在合並命令中前兩個帶有數字的問題不排序,而只有單詞的問題卻不排序。 任何可能的原因。 我有可重現的數據,可能有很多代碼,但是如果運行,它將在data.frames中更有意義。 它應該全部工作,無需任何調整。 data.tables是df =問題,df2 =庫,輸出=我希望輸出看起來像什么,而DF =是實際輸出是什么。
words1<-c(1,2,3,"How","did","Quebec")
words2<-c(.24,.25,.66,"Why","does","volicty")
words3<-c("How","do","I","clean","a","car")
library<-c(1,3,.25,.66,"How","did","does","do","I","wash","a","Quebec","car","is")
embedding1<-c(.48,.68,.52,.39,.5,.6,.7,.8,.9,.3,.46,.48,.53,.42)
df <- data.frame(words1,words2,words3)
names(df)<-c("words1","words2","words3")
words1<-c(.48,NA,.68,.5,.6,.48)
words2<-c(NA,.52,.39,NA,.7,NA)
words3<-c(.5,.8,.9,NA,.46,.53)
output<-data.frame(words1,words2,words3)
#--------Upload 2nd dataset-------#
df2 <- data.frame(library,embedding1)
names(df2)<-c("library","embedding1")
#-----Find columns--------#
l=ncol(df)
l
mynames<-colnames(df)
head(mynames)
#------Combine and match libary to training data------#
require(gridExtra)
List = list()
for(name in mynames){
df1<-df[,name]
df1<-as.data.frame(df1)
x_train2<-merge(x= df1, y = df2,
by.x = "df1", by.y = 'library',all.x=T, sort=F)
new_x_train2<-x_train2[duplicated(x_train2[,2]),]
x_train2<-x_train2[,-1]
x_train2<-as.data.frame(x_train2)
names(x_train2) <- name
List[[length(List)+1]] = x_train2
}
list<-List
DF <- as.data.frame(matrix(unlist(list), nrow=length(unlist(list[1]))))
您可以使用tidyverse
進行此tidyverse
。 這樣做可以在您的列中留下更多的NA,但可以保留順序,我認為它基本上可以滿足您的需求:
library(tidyverse)
library(reshape2)
df %>% melt(id = NULL) %>%
inner_join(.,df2, by = c("value" = "library")) %>%
spread(variable, embedding1) %>%
select(-value)
導致:
words1 words2 words3
1 NA 0.52 NA
2 NA 0.39 NA
3 0.48 NA NA
4 0.68 NA NA
5 NA NA 0.46
6 NA NA 0.53
7 0.60 NA NA
8 NA NA 0.80
9 NA 0.70 NA
10 0.50 NA 0.50
11 NA NA 0.90
12 0.48 NA NA
主要原因是因為使用merge
可以完成排序。 參見?merge
:
默認情況下,這些行在公共列上按字典順序進行排序,但對於sort = FALSE,則未指定順序。
如果循序漸進,您將看到它的實際效果。 請改用dplyr::left_join
,它保留行順序。
df1 <- df[, "words1"]
df1 <- as.data.frame(df1)
> df1
df1
1 1
2 2
3 3
4 How
5 did
6 Quebec
merge(x= df1, y = df2,
by.x = "df1", by.y = 'library', all.x=T, sort=F)
df1 embedding1
1 1 0.48
2 3 0.68
3 How 0.50
4 did 0.60
5 Quebec 0.48
6 2 NA
left_join(x = df1, y = df2, by = c("df1" = "library"), all.x = T)
df1 embedding1
1 1 0.48
2 2 NA
3 3 0.68
4 How 0.50
5 did 0.60
6 Quebec 0.48
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.