Трябва да обединя две рамки с данни. Първият изглежда така:
> df1 <- data.frame(Artist = c("Vincent van ", "Vincent van ", "Theo van Gogh", "Alexandre", "Alexandre"), Location = c("a","a","a","b","c"), time = c(1,2,1,1,1))
> df1
Artist Location time
1 Vincent van a 1
2 Vincent van a 2
3 Theo van Gogh a 1
4 Alexandre b 1
5 Alexandre c 1
И второто:
> df2 <- data.frame(Artist = c("Vincent van Gogh", "Theo van Gogh", "Alexandre Dumas", "Alexandre Dumas"), HomeNumber = c(123,234,456,789), Location = c( "a","a","b","c"))
> df2
Artist HomeNumber Location
1 Vincent van Gogh 123 a
2 Theo van Gogh 234 a
3 Alexandre Dumas 456 b
4 Alexandre Dumas 789 c
И искам този кадър с данни:
> df3 <- data.frame(Artist = c("Vincent van ", "Vincent van ", "Theo van Gogh", "Alexandre", "Alexandre"), Location = c("a","a","a","b","c"), time = c(1,2,1,1,1), HomeNumber = c(123,123,234,456,789))
> df3
Artist Location time HomeNumber
1 Vincent van a 1 123
2 Vincent van a 2 123
3 Theo van Gogh a 1 234
4 Alexandre b 1 456
5 Alexandre c 1 789
>
Обединяването ще работи само за Тео:
> df3 <- merge(df1, df2, by.x = "Artist", by.y = "Artist", all.x =TRUE)
> df3
Artist Location.x time HomeNumber Location.y
1 Alexandre b 1 NA <NA>
2 Alexandre c 1 NA <NA>
3 Theo van Gogh a 1 234 a
4 Vincent van a 1 NA <NA>
5 Vincent van a 2 NA <NA>
Причината е двойна: (а) Винсент липсва част от фамилията си в df1
. (б) Александър е името на Александър Дюма-старши и Александър Дюма-младши.
Мога да се справя с (a) с df1$Artist <- gsub("Vincent van $","Vincent van Gogh", df1$Artist)
, но данните ми всъщност са много големи и преди да изпълня gsub
, първо трябва да знам пълното име на Винсент. Едно възможно решение би било използването на grep("Vincent van "...
в df2, изграждане на функция, която ако дължината на резултантния вектор е 1
, бих използвал gsub
, за да използвам върнатите df2$Artist
до df1
. Не знам как да го направя.
(b) е малко трудно за мен. Едно решение, за което се сещам (но не мога да кодирам), е първо да използвам if
функция, за да избера Александър от едно местоположение, и след това да използвам решението за (a) до gsub
името.
Мисля, че решаването на (a) и (b) ще върне желаното от мен df3
. Имате ли идея как мога ефективно да обединя тези кадри с данни? Благодаря!
РЕДАКТИРАНЕ: Имайте предвид, че Alexandre
всъщност са две различни единици. По този начин, когато се сливат, двете трябва да имат свързаните с тях HomeNumber и Location. Vincent
е една единствена единица, но с две наблюдения във времето.
match()
, където можете да поставитеlocation
като аргумент на съвпадението и останалите колони да се показват в нов data.frame - person Duck   schedule 23.04.2013agrep
прави размито съпоставяне на низове. Можете също така да предприемете няколко стъпки за прехвърляне катоtolower
и премахване на препинателни знаци, за да помогнете... Но най-краткият отговор е, че прехвърлянето на данни е досадно! - person Justin   schedule 23.04.2013tolower
,chartr
и някои други функции. - person Lucarno   schedule 23.04.2013