2013-11-03 3 views
0

У меня есть большой набор данных, где каждая станция имеет одинаковую широту и долготу. В наборе данных некоторые строки пропускают lat и lon и вместо этого говорят «unknown». Мне нужно заполнить неизвестные длинной латкой с других станций, где эти данные отсутствуют.R кадр данных заполняется отсутствующими значениями на основе других

В этом примере я хотел бы строки 5 иметь 3 и 8 вставлены для широты и долгота:

> station <- c("a","b","c","c","c") 
> lat <- c("1","2","3","3","unknown") 
> lon <- c("6","7","8","8","unknown") 
> data.frame(station,lat,lon) 
    station  lat  lon 
1  a  1  6 
2  b  2  7 
3  c  3  8 
4  c  3  8 
5  c unknown unknown 

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

+0

Является ли это на самом деле представитель ваших данных? Другими словами, действительно ли в вашем наборе данных слово «неизвестно», или оно закодировано как «NA» (как и должно быть)? Являются ли значения в вашем 'data.frame' для« lat »и« lon »фактически числовыми значениями, или' factor's, как они есть в этом вопросе? – A5C1D2H2I1M1N2O1R2T1

+0

в исходном наборе данных говорится «неизвестно», это факторы. Я могу заставить его сказать NA, используя as.numeric при необходимости. – John

+0

Ваши данные заказываются по станции? Вы уверены, что все ваши станции имеют хотя бы один символ с допустимым значением? – agstudy

ответ

2

Что-то вроде этого, может быть, -

df$station <- as.character(df$station) 

unknownstations <- unique(subset(df,df$lat == "unknown","station")) 
unknownstationscoords <- unique(subset(df,station %in% unknownstations$station & lat != "unknown")) 

for(i in unknownstations$station) 
{ 
df[df$station == i,"lat"] <- subset(unknownstationscoords,station %in% i,"lat") 
df[df$station == i,"lon"] <- subset(unknownstationscoords,station %in% i,"lon") 
} 
0
y=function(station,lat,lon){ 

    temp=cbind(station,lat,lon) 
    lat_ind=lat!="unknown" 
    lon_ind=lon!="unknown" 


    if(all(lat_ind)==0){ 
    hash=unique(temp[lat_ind,]) 
    ind2=hash[,1]==station[!lat_ind] 
    temp[!lat_ind,]=temp[ind2,] 

    return(temp) 

    }else if(all(lon_ind)==0){ 
    hash=unique(temp[lon_ind,]) 
    ind2=hash[,1]==station[!lon_ind] 
    temp[!lon_ind,]=temp[ind2,] 

    return(temp) 


    }else { 

    return(temp) 
    } 


} 




##case1 

station <- c("a","b","c","c","c") 
lat <- c("1","2","3","3","unknown") 
lon <- c("6","7","8","8","unknown") 

y(station,lat,lon) 
# station lat lon 
# [1,] "a"  "1" "6" 
# [2,] "b"  "2" "7" 
# [3,] "c"  "3" "8" 
# [4,] "c"  "3" "8" 
# [5,] "c"  "3" "8" 


##case2 

station <- c("a","b","c","c","c") 
lat <- c("1","2","3","3","3") 
lon <- c("6","7","8","8","unknown") 
y(station,lat,lon) 
# station lat lon 
# [1,] "a"  "1" "6" 
# [2,] "b"  "2" "7" 
# [3,] "c"  "3" "8" 
# [4,] "c"  "3" "8" 
# [5,] "c"  "3" "8" 


##case3 

station <- c("a","b","c","c","c") 
lat <- c("1","2","3","3","unknown") 
lon <- c("6","7","8","8","8") 
y(station,lat,lon) 
# station lat lon 
# [1,] "a"  "1" "6" 
# [2,] "b"  "2" "7" 
# [3,] "c"  "3" "8" 
# [4,] "c"  "3" "8" 
# [5,] "c"  "3" "8" 
+0

, если вы собираетесь сделать «неизвестным» как NA, просто замените lat_ind = lat! = «Unknown» как lat_ind =! Is.na (lat) и lon_ind = lon! = "Unknown", как lon_ind =! Is.na (lon), –

+0

Кроме того, если класс lat, lon, station является фактором, используйте мою функцию как y (as.character (station), as.character (lat), as.character (lon)) –

2

Я хотел бы использовать na.locf из пакета зоопарка. Во-первых, я изменил бы unknown к NA, а затем применить na.locf:

> library(zoo) 
> df[ df=="unknown"] <- NA 
> df2 <- do.call(rbind, lapply(split(df, df$station), na.locf)) 
> df2[, -1] <- sapply(df2[, -1], as.numeric) # numeric variables should be numeric 
> df2 
    station lat lon 
a   a 1 6 
b   b 2 7 
c.3  c 3 8 
c.4  c 3 8 
c.5  c 3 8 

Если вы хотите Chanté в rownames, а затем использовать rownames и присвоить имена:

> rownames(df2) <- 1:nrow(df2) 
> df2 
    station lat lon 
1  a 1 6 
2  b 2 7 
3  c 3 8 
4  c 3 8 
5  c 3 8 
+0

исправить это! ;) воскресенье + без кофе = путаница с пакетами –

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