我有一个我想要使用的功能,但输入来自文本文件。
以下是Fun:
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执行此操作。任何提示都表示赞赏
答案 0 :(得分: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
答案 1 :(得分: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")
然后,我只需为column
和row
创建一个新变量:
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
编辑:根据您的评论和编辑的帖子,您显然有一个更复杂的功能,我试图在下面进行矢量化。输出是针对columns
和row
中每个项目的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