例如,我有一个数据框:
df <- data.frame(grp = c(1,1,1,1,1,2,2,2,2,2),
idx = c(1,2,3,4,5,1,2,3,4,5),
val = c(4,6,1,7,2,8,5,3,9,1))
Run Code Online (Sandbox Code Playgroud)
我想将每行的val除以每组中第一行的val.我发现的唯一方法是引入一个新列:
df %>% group_by(grp) %>%
arrange(idx) %>%
mutate(t = ifelse(row_number(idx) == 1, val, 0)) %>%
mutate(val = val / sum(t))
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来做到这一点?
在下面的红宝石代码中,'eval'比'def'慢10倍以上.
我理解'eval'需要解析字符串,但我想在这个例子中只需要完成一次.
require "benchmark"
GC.disable
eval "def run1; 10_000.times { #{"$a[5]\n" * 10_000} } end"
def run2
10_000.times { "#{"$a[5]\n" * 10_000}" }
end
$a = [1,2,3,4,5,6,7,8,9,10]
puts "run1:"
puts Benchmark.measure { run1 }
puts "run2:"
puts Benchmark.measure { run2 }
Run Code Online (Sandbox Code Playgroud) 我lein new app test-println用来创建一个clojure应用程序并启动repl lein repl,然后我输入(map println [1 2 3 4 5 6])并获得预期的结果:
test-println.core=> (map println [1 2 3 4 5 6])
1
2
3
4
5
6
(nil nil nil nil nil nil)
但是,如果我添加(map println [1 2 3 4 5 6])到结尾src/test_println/core.clj:
(ns test-println.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!")
(map println [1 2 3 4 5 6]))
Run Code Online (Sandbox Code Playgroud)
lean run仅打印 …