У меня есть dataframe
myDF
, созданный вот так:
a <- 1:4
b <- seq(3, 16, length=4)
myDF <- data.frame(a=a, b=b)
что выглядит так:
a b
1 1 3.000000
2 2 7.333333
3 3 11.666667
4 4 16.000000
Теперь я хочу разделить последовательно предшественника и преемника в каждом столбце, добавить результаты в существующий фрейм данных, заменить одно отсутствующее значение в каждом столбце на NA
и добавить новые имена столбцов. В приведенном выше примере желаемый результат выглядит так:
a b amod bmod
1 1 3.000000 NA NA
2 2 7.333333 2.000000 2.444444
3 3 11.666667 1.500000 1.590909
4 4 16.000000 1.333333 1.371429
Итак, в столбце a
2 делится на 1, 3 делится на 2, а 4 делится на 3, а результаты сохраняются в amod
.
Я делаю это сейчас так:
divStuff <-function(aCol){
newCol <- aCol[2:length(aCol)]/aCol[1:length(aCol) - 1]
newCol <- c(NA, newCol)
return(newCol)
}
newDF <- data.frame(lapply(myDF, divStuff))
names(newDF) <- paste(names(myDF), "mod", sep="")
endDF <- cbind(myDF, newDF)
Я написал функцию divStuff
, которая выполняет деление, а затем вызывает lapply
, который применяет эту функцию к каждому столбцу фрейма данных.
Теперь мне интересно, можно ли это сделать так или есть более разумный способ выполнения таких операций, которые, например, избегайте вызова cbind
или выполняет cbind
таким образом, чтобы избежать строки newCol <- c(NA, newCol)
путем автоматического добавления NA
. Я не нашел хорошего способа, все решения для этого выглядят похоже на этот.