2015-05-12 59 views
0

我有一個功能,我想使用它,但輸入來自一個文本文件。如何在文本文件中循環一個函數?

這裏是樂趣:

myfun <- function(latitude,longitude) { 
    column =latitude*5 
    row =longitude*3 
    return(c(column, row)) 
     } 

現在,我有我的功能信息的文本文件。

cor=read.table("C:\\Data\\AMS.txt", sep="") 
head(cor) 
    V1  V2 V3  V4 V5 V6 
1 lat  13 lon  2 Site: As 
2 lat  14 lon  3 Site: Ad 

輸出所需,例如:

lat  lon  column row site  
13   2  ?  ? As 

我可以手動做到這一點,但因爲我有很多,這將是更好的令R去做。任何提示讚賞

+1

的最好的事情是確定的,例如新列的函數'FUNC =功能(緯度,經度)LAT + long',然後像做'變換(COR,列= func(V2,V4))' –

+1

函數可以返回一個列表:'func = function(lat,long)list(lat + long,lat * long))'和:'transform(cor,newcol1 = func(V2, V4)[[1]],newcol2 = func(V2,V4)[[2]])' –

+0

最好使用vecotrized操作而不是函數......如果你確實需要每行一個函數行, 'apply'。問題是你最小的例子可以是矢量化的,所以你真正要問的是誤導...... –

回答

1

除非你需要使用函數我會使用向量化的解決方案。首先,我要收拾你的數據幀:

cor <- read.table("C:\\Data\\AMS.txt", sep="") # note <- not = 
require("dplyr") 
cor <- select(cor, -V1) 
cor <- select(cor, -V3) 
cor <- select(cor, -V5) 
colnames(cor) <- c("lat", "long", "site") 

然後,我只需要創建一個新的變量columnrow

cor$column <- cor$lat * 5 
cor$row <- cor$long * 3 

產量:

cor 
# lat long site column row 
# 1 13 2 As  65 6 
# 2 14 3 Ad  70 9 

編輯:根據你的評論和編輯過的帖子,你顯然有一個更復雜的功能,我試圖在下面進行矢量化。輸出是針對columnsrow中的每一個的5個項目的向量,所以希望這是您的預期行爲。

kR = 6371.228 # recommend constants start with 'k' 
kC = 25.067525 
kNc = 1383 
kNl = 586 
kR0 = (kNc - 1)/2 
kS0 = (kNl - 1)/2 
kDeg2rad_cte = pi/180 

cor$lamda <- cor$lon * kDeg2rad_cte 
cor$phi <- cor$lat * kDeg2rad_cte 

column <- round(kR0 + (kR/kC) %*% cor$lamda * cos(pi/6)) + 1 
row <- 586 - round(kS0 - (kR/kC) %*% sin(cor$phi)/cos(pi/6)) 

column <- seq(min(column), max(column), by=1) 
row <- seq(min(row), max(row), by=1) 

column 
# [1] 700 701 702 703 704 

row 
# [1] 360 361 362 363 364 
+0

http://stackoverflow.com/questions/1741820/assignment-operators-in-r-and – Phil

+0

你的實際功能可以被矢量化嗎?你可以發佈嗎? – Phil

+0

恐怕我沒有任何矩陣乘法的經驗,所以我不禁進一步。它可能是矢量化的,但是如果你想使用一個函數,可以檢查'apply(cor,margin = 1,function(...)'對數據幀中的行進行計算。 – Phil

2

嘗試:

data.frame(lat=DF$V2, lon=DF$V4, column=DF$V2*5, row=DF$V4*3, site=DF$V6)

無需清洗。

數據

DF <- read.table(text=" V1  V2 V3  V4 V5 V6 
1 lat  13 lon  2 Site: As 
2 lat  14 lon  3 Site: Ad", header=T) 

> DF1 <- data.frame(lat=DF$V2, lon=DF$V4, column=DF$V2*5, row=DF$V4*3, site=DF$V6) 
> DF1 
    lat lon column row site 
1 13 2  65 6 As 
2 14 3  70 9 Ad 
相關問題