У меня есть два набора данных.Оба содержат большую часть данных - около 1 миллиона строк на 300 столбцов для реального набора данных.Я хочу объединить два набора данных общими словами, которые у них есть.Кроме того, я хотел бы объединить каждую ячейку, которая соответствует столбцам и общим словам, и создать третий элемент data.frame.У меня есть несколько примеров данных ниже.
Это первый набор данных.Это меньше ...
set.seed(511111)
#first data.frame with a smaller datasset
df<-matrix(data=rnorm(n=300,mean=10,sd=300),nrow=6,ncol=2)
words<-c("a","by","the","hi","bye","see")
df<-cbind(words,df);colnames(df)=c("y",paste0("V",c(1:2)))
df
y V1 V2
[1,] "a" "158.979716349289" "-16.2574951855564"
[2,] "by" "164.995114380192" "-68.1726437428752"
[3,] "the" "720.223066121601" "1054.04351778352"
[4,] "hi" "-288.629142240942" "537.900385284324"
[5,] "bye" "-581.097490056299" "183.495782507513"
[6,] "see" "-192.129441997881" "-117.187652711745"
Это второй набор данных.это больше
#second data.frame with a larger dataset
df2<-matrix(data=rnorm(n=300,mean=0,sd=1),nrow=10,ncol=2)
words2<-c("a","when","by","hi","was","bye","see","how","where","went")
df2<-cbind(words2,df2);colnames(df2)=c("y",paste0("V",c(1:2)))
df2
y V1 V2
[1,] "a" "2.55623583381151" "0.686246827197614"
[2,] "when" "-2.19232079339484" "-0.620807684132454"
[3,] "by" "-0.310318599027961" "-0.456190746859373"
[4,] "hi" "-0.0166971880962356" "1.21756976500452"
[5,] "was" "1.27945031935845" "-1.56033115877046"
[6,] "bye" "0.169979040969853" "0.19817006675571"
[7,] "see" "2.2791761351847" "-0.284258324796253"
[8,] "how" "1.92863014151405" "-1.27270442280769"
[9,] "where" "-1.29927355911528" "-1.45698273893523"
[10,] "went" "0.154918778937943" "-2.03576369295626"
Вот общие слова от df и df2 ...
#common words in df and df2 are
common.words<-c("a","by","hi","bye","see")
common.words
[1] "a" "by" "hi" "bye" "see"
Я хочу, чтобы третий набор данных выглядел как этот набор данных.Поэтому я возьму среднее значение каждого столбца на одно слово.Поэтому для столбца V1 = (df [1,2] и df2 [1,2]) для word = "a" и поместите это в df3.Я буду делать это для примерно 20 000 или около того общих слов в реальном наборе данных, который у меня есть.Для слов, которые не совпадают ни в одном наборе данных, я хотел бы отбросить эти слова, иметь их в качестве значений NA или включить их значения без среднего значения для каждого набора данных, чтобы это была смесь усредненных общих слов + уникальных слов изDF и DF2.В зависимости от того, что проще ...
#what I want the dataset to look like after its finished merging and averaging columns V1 and V2 for common words
Для первого значения -200,365 было вычислено среднее значение df [1,2] (-399.988526255518) и df2 [1,2] ("-1.47232443999644"), общее слово для этой строки было" а ".Для второго значения 8,64, было вычислено путем взятия среднего значения df [1,3] (16,9236076090913) и df2 [1,3] («-0,520509732658999»), общее слово для этой строки было «а».
numbers<-data.frame(V1=c("-200.365","121.227","91.187","29.125","100.76"),
+ V2=c("8.64","80.558","-138.89","68.11","86.454"))
df3<-cbind(common.words,numbers)
df3
common.words V1 V2
1 a 80.8 -7.79
2 by 82.3 -34.3
3 bye -290. 91.8
4 hi -144. 270.
5 see -94.9 -58.7
Я добавил ваше решение как ответ на эту проблему ...
df <- data.frame(df)
df2 <- data.frame(df2)
library(dplyr)
#df.list=list(df,df2)
df3<-bind_rows(df,df2) %>%
+ mutate_at(vars(starts_with("V")), as.numeric) %>%
+ filter(y %in% common.words) %>%
+ group_by(y) %>%
+ summarise_all(mean)
Warning messages:
1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
2: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
3: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
4: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
5: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
6: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
7: In bind_rows_(x, .id) : Unequal factor levels: coercing to character
8: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
9: In bind_rows_(x, .id) :
binding character and factor vector, coercing into character vector
> df3
# A tibble: 5 x 3
y V1 V2
<chr> <dbl> <dbl>
1 a 80.8 -7.79
2 by 82.3 -34.3
3 bye -290. 91.8
4 hi -144. 270.
5 see -94.9 -58.7