【发布时间】:2015-04-02 15:15:17
【问题描述】:
对我的数据类型来说,一个非常常见的操作是对所有列应用归一化因子。这可以使用sweep 或scale 有效地完成:
normalized = scale(data, center = FALSE, scale = factors)
# or
normalized = sweep(data, 2, factors, `/`)
在哪里
data = structure(list(A = c(3L, 174L, 6L, 1377L, 537L, 173L),
B = c(1L, 128L, 2L, 1019L, 424L, 139L),
C = c(3L, 66L, 2L, 250L, 129L, 40L),
D = c(4L, 57L, 4L, 251L, 124L, 38L)),
.Names = c("A", "B", "C", "D"),
class = c("tbl_df", "data.frame"), row.names = c(NA, -6L))
factors = c(A = 1, B = 1.2, C = 0.8, D = 0.75)
但是,当我的数据前面有其他列时,如何使用 dplyr 执行此操作?我可以在单独的语句中执行此操作,但我希望在 one 管道中执行此操作。这是我的数据:
data = structure(list(ID = c(1, 2, 3, 4, 5, 6),
Type = c("X", "X", "X", "Y", "Y", "Y"),
A = c(3L, 174L, 6L, 1377L, 537L, 173L),
B = c(1L, 128L, 2L, 1019L, 424L, 139L),
C = c(3L, 66L, 2L, 250L, 129L, 40L),
D = c(4L, 57L, 4L, 251L, 124L, 38L)),
.Names = c("ID", "Type", "A", "B", "C", "D"),
class = c("tbl_df", "data.frame"), row.names = c(NA, -6L))
我想改变数据列而不触及前两列。通常我可以用mutate_each 做到这一点;但是,我如何无法将归一化因子传递给该函数:
data %>% mutate_each(funs(. / factors), A:D)
这毫不奇怪,假设我想将每一列除以factors,而不是每一列除以其匹配因子。
【问题讨论】:
-
也许这有帮助
data %>% list(as.list(factors)) %>% Reduce(/, .) -
@akrun 不,这根本行不通。
-
我做了以下实验。我为
factors创建了一个df 并尝试了mutate_each。结果似乎还好。但是,我想这不是你所追求的。factors <- data.frame(A = 1, B = 1.2, C = 0.8, D = 0.75); mutate_each(data, funs(. / factors$.), A:D) -
@akrun 任务完成。 :)
-
另一种选择,虽然不如 jazzuro 的答案那么有效和简洁,但它是使用
do,如data %>% do(data.frame(.[1:2], sweep(.[-c(1:2)], 2, factors,/)))