我有以下数据框:
df <- data.frame(type = c("planes", "trains", "automobiles"), t1 = c(4, 5, 6), t2 = c(20, 60, 24), t3 = c(100, 120, 72), t4 = c(800, 360, 144))
df
type t1 t2 t3 t4
1 planes 4 20 100 800
2 trains 5 60 120 360
3 automobiles 6 24 72 144
我想写一个函数,它接受每列中的值并将它们除以前一列,从t2 / t1开始,这样我得到一个如下所示的新数据框:
new_df
type t1 t2 t3 t4
1 planes 5 5 8
2 trains 12 2 3
3 automobiles 4 3 2
使用扫描功能可能有办法实现这一点,但我还没有找到它。
提前致谢!
答案 0 :(得分:5)
$scope.user = Authentication._data.user;//the token object data NOT here
df[, 3:5] <- df[, 3:5] / df[, 2:4]
# type t1 t2 t3 t4
# 1 planes 4 5 5 8
# 2 trains 5 12 2 3
# 3 automobiles 6 4 3 2
也可以使用
Map
答案 1 :(得分:3)
也许更一般地说:
func <- function(x) {
numcols <- ! sapply(x, class) %in% c('character','factor')
nc <- sum(numcols)
if (nc > 1) {
m <- x[,numcols]
x[,numcols] <- m[,2:nc] / m[,1:(nc-1)]
}
x
}
func(df)
## type t1 t2 t3 t4
## 1 planes 5 5 8 5
## 2 trains 12 2 3 12
## 3 automobiles 4 3 2 4
您可能希望在分母中添加零保护措施,除以FALSE
(同样的事情),以及其他此类角落案例。