这是一个简化的例子:
library(tidyverse)
frame <- tribble(
~a, ~b, ~c,
1, 1, 2,
5, 4, 7,
2, 3, 4,
3, 1, 6
)
key <- tribble(
~col, ~name, ~type, ~labels,
1, "a", "f", c("one", "two", "three", "four", "five"),
2, "b", "f", c("uno", "dos", "tres", "cuatro"),
3, "c", "f", 1:7
)
是否有一种优雅的方式以编程方式扫描 frame
中的列并根据 key
中的参数应用特定因子类?预期结果将是:
# A tibble: 4 x 3
a b c
<fctr> <fctr> <fctr>
1 one uno 2
2 five cuatro 7
3 two tres 4
4 three uno 6
到目前为止,我所拥有的最佳解决方案是使用 purrr
的 map2()
,但IMO的分配不是最优雅的:
frame[key$col] <- map2(key$col, key$labels,
function(x, y) factor(frame[[x]], levels = 1:length(y), labels = y))
有没有人有更整洁的解决方案?请注意,我的原始数据框有数百列,我需要重新考虑大多数列的不同级别/标签,因此该过程必须自动化 .
4 回答
我很想知道为此提出了哪些其他解决方案 . 我唯一的建议是稍微更改建议的解决方案,以便更清楚
frame
将以某种方式进行修改,而不是将其留在map2
使用的函数体内 .例如,在
map2
的调用中将frame
作为附加参数传递:或者使用管道运算符
%>%
执行相同的操作:这是另一种解决方案 . 我不确定它是如何"elegant" . 希望有人可以改进 .
我不知道这个答案是否满足你整洁的要求,因为它使用了一个普通的旧循环 . 但是它完成了这项工作,在我看来,它很容易阅读/理解,而且速度也相当快 .
典型的整洁方法是重新整形数据以将所有变量放在一列中,然后将函数应用于该列,最后将其重新整形为原始格式 . 但是,因素并不是真的那样,因此我们需要使用其他方法 . 这些因素甚至被认为是整洁的吗?
编辑
关于我假设for循环类似于
map2
-function,我错了 .以下是一些基准测试:
对于这个问题,您可以使用基本R代码: