2015-10-23 64 views
0

我試圖將點值轉換爲使用sp程序包進行座標以執行類似於this question的操作。我有一個數據框的列表(全數據集中有數百個,這裏有兩個短數據)。轉換爲數據幀列表上的座標

> dput(df) 
list(structure(list(group = c(22, 43, 43, 36, 9, 20, 35, 18, 
32, 2), mean_x_m = c(-2578373.61904762, -2082265, -1853701.875, 
-2615961.89189189, -1538829.07815509, -1753235.6200847, -1690679.5, 
-1694763.64583333, -1700343.15217391, -1416060), mean_y_m = c(3242738.76190476, 
2563892.5, 1945883.125, 3130074.86486486, 1373724.65001039, 1468737.97186933, 
2123413.5, 1442167.01388889, 2144261.73913043, 1352573.33333333 
)), .Names = c("group", "mean_x_m", "mean_y_m"), row.names = c(72L, 
140L, 142L, 121L, 27L, 66L, 114L, 60L, 105L, 5L), class = "data.frame"), 
    structure(list(group = c(12, 12, 47, 30, 39, 34, 47, 22, 
    10, 1), mean_x_m = c(-1830635.68663753, -2891058.33333333, 
    -1637448.59886202, -1974773.67400716, -1571853.24324324, 
    -2723090.33333333, -2704594.92760618, -2240863.49122807, 
    -1940748.88253242, -2176724.69924812), mean_y_m = c(2324222.49926225, 
    3261997.5, 2057096.55049787, 2411733.29933653, 1447883.78378379, 
    3406879.26666667, 3291053.77606178, 2788255.49473684, 2176919.6882151, 
    2920168.77443609)), .Names = c("group", "mean_x_m", "mean_y_m" 
    ), row.names = c(67L, 68L, 243L, 155L, 202L, 173L, 244L, 
    114L, 61L, 3L), class = "data.frame")) 

我可以一次拉出一個數據幀並將其轉換爲SpatialPointsDataFrame而沒有問題。

df1 = df[[1]] 
coordinates(df1) = ~mean_x_m+mean_y_m 

我的問題是我不能得到這個迭代使用功能的完整列表,甚至得到的功能單個數據幀的工作。

c = function(f){coordinates(f) = ~mean_x_m+mean_y_m} 
df2 = c(df1) 
c(df1) 
df3 = lapply(df,c) 

for循環會更好嗎?我仍然在學習如何使用數據框和矩陣列表,所以在這方面的任何幫助或在這方面將不勝感激。謝謝。

回答

2

這是你怎麼能lapply使用:

fc <- function(f){coordinates(f) = ~mean_x_m + mean_y_m; f} 
lapply(df, fc) 

的問題是,你的函數沒有返回任何東西。

爲了使單個對象:

x <- lapply(1:length(df), function(i) cbind(id=i, df[[i]])) 
x <- do.call(rbind, x) 
coordinates(x) <- ~mean_x_m+mean_y_m 
1

如果您的數據框架具有一致的結構,最好將它們全部放入一個數據框中。

library(dplyr) 
library(sp) 

result = 
    df %>% 
    bind_rows(.id = "list_number") %>% 
    as.data.frame %>% 
    `coordinates<-`(~mean_x_m+mean_y_m) 
+0

感謝。如果我可以爲每個原始數據框添加一個具有唯一標識符的列,然後我可以稍後進行聚合/排序/拆分,那麼這可能會起作用。有關使用dplyr在您提供的相同代碼中執行此操作的任何快速提示? – tjr

+0

它應該已經存在,位於名爲「list_number」的列中。您可以根據需要更改名稱。 – bramtayl

1

如果您正在使用的地理數據的工作,我覺得這是最容易使用的空間點和SpatialPointsDataFrame類來存儲數據。要轉換包含dataframes用相同的列標題,你能適應這個代碼列表中的所有元素:

library(sp) 
# toy dataset X 
X<-list(
x1 = data.frame(group =c("a","b","c"), X = c(-110.1,-110.2,-110), Y = c(44,44.2,44.3)), 
x2 = data.frame(group =c("a","b","c"), X = c(-110.1,-110.2,-110), Y = c(44,44.2,44.3))) 
# write a function based on the structure of your dfs 
spdf_fxn<-function(df){ 
SpatialPointsDataFrame(coords= cbind(df$X,df$Y), data= data.frame(group = df$group), 
        proj4string=CRS("+proj=longlat +datum=WGS84")) 
} 
#apply this function over the list 
Out_List<-lapply(X,spdf_fxn) 

寫一個函數的通用數據幀結構轉換爲SpatialPointsDataframe,以組爲數據附加到每個點,然後將該函數應用於列表。請注意,您必須調整列名稱並使用適當的proj4string(在本例中,它是WGS 84中的經度和緯度)。