2017-01-04 3 views
0

Я работаю с двумя различными кадрами данных. В первом случае у меня есть имена строк географических центроидов (точек) и имена идентификаторов колонок другого набора точек (вокзалы). Значения представляют собой расстояние между центроидами и точками в столбце (извлекается gDistance).Извлечь значения из фрейма данных, в соответствии с именами столбцов, полученными из второго фрейма данных.

С этого момента я извлек 3 ближайших точки, сохраняя их идентификаторы в переводе фрейма данных. У этого теперь есть строки с идентификаторами центроидов и как столбцы только ранга (1,2,3).

distances<- ft2miles(gDistance(stations, centroids, byid=TRUE)) 
access <-as.data.frame(apply(distances, 1, function(X) colnames(distances)[order(X)][1:3])) 
access <- as.data.frame(t(access)) 

Я хотел бы добавить к последнему кадру данных три столбца с соответствующими значениями расстояния. Чтобы быть более ясным, столбцы кадра данных расстояний соответствуют значениям второго, имена строк идентичны.

Первый кадр данных:

    158  1559  1560  1561  1722  1723  1732 166516384  1546 
croatia_new.0 1.108585 0.9434521 1.138825 1.621118 0.8457217 0.5554764 2.441048 0.7393321 6.4736425 
croatia_new.1 1.107511 1.3381573 2.970976 3.448820 2.6142722 2.0175318 4.167618 1.6984548 6.2927608 

Второй кадр данных:

   closest1 closest2 closest3 
croatia_new.0  1723 166516384  1722 
croatia_new.1  158  1559 166516384 
croatia_new.2  1546  1584 98349400 
croatia_new.3  1584  1546 98349400 

Значения этого фрейма данных, по существу, имена столбцов первого кадра данных, указывающий идентификатор из ближайших станций , То, что я хочу получить:

   closest1 closest2 closest3 
croatia_new.0 0.5554764 0.739332 0.8457217 
croatia_new.1 1.107511 1.3381573 1.6984548 
croatia_new.N ....   ....  .... 

выход, полученный с использованием раствора DigEmAll

     V1  V2  V3 
croatia_new.0 3.719507  NA  NA 
croatia_new.1 63.082290 38.04791 36.94511 
croatia_new.2  NA  NA 49.05636 
croatia_new.3 55.836949 47.74032 46.48799 
croatia_new.4 41.484741  NA 52.85941 
croatia_new.5 60.654512  NA 49.68948 

Консоль вывода:

> dput(distances["croatia_new.2",1:10]) 
structure(list(`158` = 6.99119002871976, `1559` = 7.05366412218041, 
`1560` = 6.99165462844427, `1561` = 6.79651949339854, `1722` =  7.09268368796389, 
    `1723` = 7.06552376797322, `1732` = 6.3722523477356, `166516384` = 7.1279696005328, 
`1546` = 0.153911810037831, `1584` = 0.433837036180278), .Names = c("158", 
"1559", "1560", "1561", "1722", "1723", "1732", "166516384", 
"1546", "1584"), row.names = "croatia_new.2", class = "data.frame") 

dput(access["croatia_new.2",]) 

structure(list(V1 = structure(149L, .Names = "croatia_new.2", .Label = c("1001", 
"1002", "1003", "1004", "1005", "1006", "1007", "1018", "1019", 
"1020", "1023", "1024", "1025", "1031", "1038", "1042", "1045", 
"1046", "1047", "1048", "1050", "1052", "1053", "1054", "1056", 
"105753770", "1059", "1061", "1062", "1064", "1065", "1067", 
"1073", "1076", "1085", "1088", "109", "1091", "1093", "1095", ....."999"), class = "factor")), .Names = c("V1", 
"V2", "V3"), row.names = "croatia_new.2", class = "data.frame") 
+2

Пожалуйста, представьте [минимальный воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a -great-r-reproducible-example) – digEmAll

+0

Надеюсь, теперь стало яснее –

+0

Итак, вы хотите объединить 2 data.frame, правда? Попробуйте 'merge (DF1, DF2, by =" StationNameColumn ")' – digEmAll

ответ

2

Я думаю, что вы хотите что-то вроде этого:

### RECREATE THE INPUT EXAMPLE 
DF1 <- read.csv(text= 
"158,1559,1560,1561,1722,1723,1732,166516384,1546 
croatia_new.0,1.108585,0.9434521,1.138825,1.621118,0.8457217,0.5554764,2.441048,0.7393321,6.4736425 
croatia_new.1,1.107511,1.3381573,2.970976,3.448820,2.6142722,2.0175318,4.167618,1.6984548,6.2927608", 
check.names=FALSE 
) 
DF2 <- read.csv(text= 
"closest1,closest2,closest3 
croatia_new.0,1723,166516384,1722 
croatia_new.1,158,1559,166516384 
croatia_new.2,1546,1584,98349400 
croatia_new.3,1584,1546,98349400" 
) 

# ensure the values of DF2 are characters 
DF2[] <- lapply(DF2, as.character) 

# for each row of DF2, we search for the value in DF1 using the 
# row names and column names stored in DF2. 
# The result will be a list of numeric values. 
rows2bind <- 
    lapply(1:nrow(DF2),function(i){ 
    station <- row.names(DF2)[i] 
    row <- DF2[i,] 
    row2 <- as.numeric(DF1[match(station,row.names(DF1)),]) 
    return(row2[match(as.character(row),colnames(DF1))]) 
    }) 

# we turn the list into a data.frame similar to DF2 but with values instead of column names 
DF2ext <- setNames(as.data.frame(do.call(rbind,rows2bind),row.names=row.names(DF2)), colnames(DF2)) 

# we add the closest columns to DF1 
DF1ext <- cbind(DF1,DF2ext[match(row.names(DF1),row.names(DF2ext)),]) 

Результаты:
(обратите внимание на последние 3 колонки DF1ext)

> DF2ext 
       closest1 closest2 closest3 
croatia_new.0 0.5554764 0.7393321 0.8457217 
croatia_new.1 1.1075110 1.3381573 1.6984548 
croatia_new.2  NA  NA  NA 
croatia_new.3  NA  NA  NA 

> DF1ext 
        158  1559  1560  1561  1722  1723  1732 166516384  1546 closest1 closest2 closest3 
croatia_new.0 1.108585 0.9434521 1.138825 1.621118 0.8457217 0.5554764 2.441048 0.7393321 6.473643 0.5554764 0.7393321 0.8457217 
croatia_new.1 1.107511 1.3381573 2.970976 3.448820 2.6142722 2.0175318 4.167618 1.6984548 6.292761 1.1075110 1.3381573 1.6984548 
+0

Итак, просто скопировав свой код в новом скрипте, он отлично работает, как вы показали. Когда я пытаюсь применить его к моему скрипту, что-то пойдет не так, потому что результат странный. в кадре данных DF1ext отсутствуют некоторые значения (NA), а когда нет, они не так ожидаются. Может быть из-за количества строк в двух наборах данных? первая из них: 862 строки 978 столбцов, вторая: 862 строка, 3 столбца. –

+0

NA могут быть сгенерированы, когда имя строки в DF1 отсутствует в DF2 или когда значение ячейки в DF2 не соответствует имени столбца DF1 ... – digEmAll

+0

@GabrieleFilomena: Я думаю, что может возникнуть ошибка из-за того, что что в R data.frame подмножество имен строк работает с частичным сопоставлением (например, 'DF [" croatia.1 ",]' равно 'DF [" croatia.11 ",]', если существует только 'croatia.11') , Я изменил код, чтобы исправить проблему, повторите попытку;) – digEmAll

Смежные вопросы