对我的数据类型来说,一个非常常见的操作是将归一化因子应用于所有列 . 这可以使用 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执行此操作?我可以在单独的语句中完成它,但我想在一个管道中完成它 . 这是我的数据:
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
,而不是按每个列除以匹配因子 .
1 回答
鉴于akrun的鼓励,让我在这里发布我所做的答案 . 我只是直觉地认为您可能想要让R指出具有相同名称的列来执行此操作
mutate_each
. 例如,如果.
指示列A
,我认为另一个名为A
的列来自另一个data.frame可能是dplyr
可能会喜欢的 . 所以,我为factors
创建了一个数据框,然后使用mutate_each
. 结果似乎是正确的 . 由于我没有技术背景,我担心我无法提供任何解释 . 我希望你不介意 .编辑
这也有效 . 鉴于数据框是列表的特例,这也许并不令人惊讶 .