Управление кадром данных с содержимым из другого кадра данных - PullRequest
0 голосов
/ 27 мая 2011

У меня большой data.frame с географическими названиями мест (mydata).Места появляются в data.frame в нескольких ячейках.

В другом файле с 3 столбцами у меня есть все эти места (первый столбец), широта этих мест (во вторых места появляются в data.frame в более чем одной ячейке).В другом файле с 3 столбцами у меня есть все эти места (первый столбец), широта этих мест (второй столбец) и долгота в третьем столбце.

Я хочу создать две другие матрицы (Lat и Long) с размером, равным размеру data.frame с такими географическими точками, что:

Lat[i,j] = Latitude of the place in mydata[i,j]
long[i,j]= longitude of the place in mydata[i,j]

Итак, я ищу процедуру, которая проходит через mydata, выберите имяместа в каждой ячейке, найдите Широту и Долготу во втором файле и заполните эти значения в матрицах Lat и Long.

mydata <- data.frame(cbind(c("xyz","ab","yabc",NA)), 
                           c("xyz","xyz","yabc","ab")),
                           c("ab","ab",NA,"yabc")))
Coor   <- data.frame(cbind(c("ab","xyz","yabc"), 
                           c(31.34,42.15,36.98), 
                           c(12.87,13.67,18.56)))

Я хочу, чтобы метод получил

Lat <- data.frame(cbind(c(42.15,31.34,36.98,NA),
                        c(42.15,42.15,36.98,31.34),
                        c(31.34,31.34,NA,36.98)))

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Примерно так:

Lat<-do.call(cbind, lapply(mydata, function(curcol){ Coor[match(curcol, Coor[,1]), 2]  }))

Это нормально?

1 голос
/ 22 июля 2011

Вот простая процедура, которая производит то, что вы хотите. Может быть способ сделать это без явного цикла for, используя *apply и индексы, но это доступно для чтения.

#Define columns explicitly, avoiding cbind and the resulting coercion to characters
mydata <- data.frame(X1=c("xyz","ab","yabc",NA),X2= c("xyz","xyz","yabc","ab"), X3=c("ab","ab",NA,"yabc"))
Coor   <- data.frame(X1=c("ab","xyz","yabc"),X2=c(31.34,42.15,36.98),X3=c(12.87,13.67,18.56))

Lat <- data.frame(cbind( c(42.15,31.34,36.98,NA),c(42.15,42.15,36.98,31.34),c(31.34,31.34,NA,36.98)))

#Create the new lat/long matrices to hold the result
Lat1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata))
Long1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata))

for (i in 1:ncol(mydata)){
    Lat1[,i] <- Coor[match(mydata[,i],Coor$X1),2]
    Long1[,i] <- Coor[match(mydata[,i],Coor$X1),3]
}

Сравнение желаемого результата:

Lat
     X1    X2    X3
1 42.15 42.15 31.34
2 31.34 42.15 31.34
3 36.98 36.98    NA
4    NA 31.34 36.98

Lat1
      [,1]  [,2]  [,3]
[1,] 42.15 42.15 31.34
[2,] 31.34 42.15 31.34
[3,] 36.98 36.98    NA
[4,]    NA 31.34 36.98

И это то, что это решение производит в Long1:

Long1
      [,1]  [,2]  [,3]
[1,] 13.67 13.67 12.87
[2,] 12.87 13.67 12.87
[3,] 18.56 18.56    NA
[4,]    NA 12.87 18.56
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...