2017-03-06 69 views
3

操縱功能,這應該是有人在那裏一個簡單的問題...內lapply

我有一個看起來像這樣的數據幀:

df1 
longitude lattitude 10000 5 1.5 1.4 1.3 1.2 1 0.5 0.1 0.001 
0 -119.8304 34.44190 107 14 8 8 8 8 7 5 5  1 
1 -119.6768 34.41962 107 19 5 5 5 5 5 3 2  1 
2 -119.7162 34.41911 107 25 9 8 8 5 4 1 1  1 
3 -119.7439 34.44017 107 22 7 7 6 5 5 2 1  1 

這是由該代碼創建:

library(geosphere) 

df1 <- data.frame(longitude=c(-119.8304, -119.6768, -119.7162, -119.7439, -120.4406, -119.5296, -120.4198, -119.8221, -119.7269, -120.4252, -120.4573, -120.4581), 
       lattitude=c(34.44, 34.42, 34.42, 34.44, 34.64, 34.41, 34.94, 34.44, 34.44, 34.97, 34.65, 34.65)) 
boundary <- c(10000, 5, 1.5, 1.4, 1.3, 1.2, 1, 0.5, 0.1, 0.001) 
names(boundary) <- boundary 
df1 <- cbind(df1, lapply(boundary, function(x) rowSums(distm(df1, fun = distHaversine)/1000 <= x))) 

但我需要操縱數據框df1中的值,使得除latitudelongitude之外的所有列中的值將除以pi*x^2(pi倍x平方)。我可以在這種情況下使用lapply嗎?

輸出應該是這樣的:

df1 
longitude lattitude 10000 5  1.5 1.4 1.3 1.2 1 0.5 0.1 0.001 
0 -119.8304 34.44190 0  0.177 1.12 1.29 etc... 

回答

2

我們可以使用setdiff獲得的數據集的名字除了「東經」,「lattitude」列。然後依次通過列的子集,做計算,並更新數據集

j1 <- setdiff(names(df1), c("longitude", "lattitude")) 
df1[j1] <- lapply(df1[j1], function(x) x/(pi*x^2)) 

或者我們可以使用tidyverse

library(dplyr) 
df1 %>% 
    mutate_at(vars(-matches("longitude", "lattitude")), funs(./(pi*.^2))) 
+0

嗨@akrun。你似乎把pi * ^。2增加到'names(df)'?但我實際上需要用pi * x^2(x是「邊界」)來分割'df1'的輸出值。希望這是有道理的。請指教。 – JAG2024

+0

@ JAG2024好吧,糾正它 – akrun

+0

酷!最後一個請求。您可以將緯度,經度列添加回最終的數據框嗎? @akrun – JAG2024