Мне нужно сделать учебник для начинающих, используя функцию R * apply (без использования пакета reshape или plyr в первый раз)
Я пытаюсь lapply
(потому что я прочитал apply
, что плохо для данных) простую функцию для этого кадра данных, и я хочу использовать именованный столбец для доступа к данным:
fDist <- function(x1,x2,y1,y2) {
return (0.1*((x1 - x2)^2 + (y1-y2)^2)^0.5)
}
data <- read.table(textConnection("X1 Y1 X2 Y2
1 3.5 2.1 4.1 2.9
2 3.1 1.2 0.8 4.3
"))
data$dist <- lapply(data,function(df) {fDist(df$X1 , df$X2 , df$Y1 , df$Y2)})
У меня есть эта ошибка $ operator is invalid for atomic vectors
, возможно, потому что датафрейм изменен с помощью laply? ... Есть ли лучший способ сделать это с $ named column?
Я решаю свой первый вопрос с помощью ответа @DWin. Но у меня есть другая проблема, непонимание, со смешанным фреймом данных (цифра + символ):
В моем новом сценарии использования я использую две функции для вычисления расстояния, потому что моя цель состоит в том, чтобы сравнить точку Point между всеми другими точками.
data2 <- read.table(textConnection("X1 Y1 X2 Y2
1 3.5 2.1 4.1 2.9
2 3.1 1.2 0.8 4.3
"))
data2$char <- c("a","b")
fDist <- function(x1,y1,x2,y2) {
return (0.1*((x1 - x2)^2 + (y1-y2)^2)^0.5)
}
fDist2 <- function(fixedX,fixedY,vec) {
fDist(fixedX,fixedY,vec[['X2']],vec[['Y2']])
}
# works with data (dataframe without character), but not with data2 (dataframe with character)
#ok
data$f_dist <- apply(data, 1, function(df) {fDist2(data[1,]$X1,data[1,]$Y1,df)})
#not ok
data2$f_dist <- apply(data2, 1, function(df) {fDist2(data2[1,]$X1,data2[1,]$Y1,df)})