我想将一列除以另一列以获得每人时间我该怎么做?我找不到任何关于如何划分的信息。
这是我想使用的一些数据
min count2.freq
263807.0 1582
196190.5 1016
586689.0 3479
最后,我想添加这样的第三列,其中的数字来自min / count2.freq
例如263808.0/1582 = 166.75
有很多方法可以做到这一点。问题是如何让 R 知道您希望划分的变量的位置。
假设
d <- read.table(text = "263807.0 1582
196190.5 1016
586689.0 3479
")
names(d) <- c("min", "count2.freq")
> d
min count2.freq
1 263807.0 1582
2 196190.5 1016
3 586689.0 3479
要将所需的除法添加为第三个变量,我将使用transform()
> d <- transform(d, new = min / count2.freq)
> d
min count2.freq new
1 263807.0 1582 166.7554
2 196190.5 1016 193.1009
3 586689.0 3479 168.6373
如果在函数中执行此操作(即您正在编程),那么最好避免上面显示的糖和索引。在那种情况下,这些中的任何一个都会做你想要的
## 1. via `[` and character indexes
d[, "new"] <- d[, "min"] / d[, "count2.freq"]
## 2. via `[` with numeric indices
d[, 3] <- d[, 1] / d[, 2]
## 3. via `$`
d$new <- d$min / d$count2.freq
所有这些也可以在提示符下使用,但更容易阅读:
d <- transform(d, new = min / count2.freq)
或者
d$new <- d$min / d$count2.freq ## or any of the above examples
希望你像我一样思考,第一个版本更好;-)
我们在编程时不使用tranform()
et al 的语法糖的原因是因为它们如何进行评估(查找命名变量)。在顶层(在提示下,以交互方式工作)transform()
等人工作得很好。但是埋在函数调用中或在apply()
对函数家族之一的调用中,它们可以而且经常会中断。
同样,小心使用数字索引(## 2.
上面);如果您更改数据的顺序,您将选择错误的变量。
如果您只想进行除法(而不是将结果插入数据框中,请使用with()
,这使我们能够隔离您希望评估的简单表达式
> with(d, min / count2.freq)
[1] 166.7554 193.1009 168.6373
这又是比等效代码更简洁的代码
> d$min / d$count2.freq
[1] 166.7554 193.1009 168.6373
因为它明确指出“使用d
,执行代码min / count2.freq
。你的偏好可能与我的不同,所以我已经展示了所有选项。
哈德利·威克姆
dplyr
在数据争吵的情况下,packages 始终是一个保护程序。要将所需的除法添加为第三个变量,我将使用mutate()
d <- mutate(d, new = min / count2.freq)