如何使用 dplyr 扫描特定列?
How do I sweep specific columns with dplyr?
对我的数据类型来说,一个非常常见的操作是对所有列应用归一化因子。这可以使用 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
,而不是将每列除以其匹配因子。
在 akrun 的鼓励下,让我 post 在这里回答我所做的事情。我只是直觉地认为您可能希望 R 指示具有相同名称的列来执行此操作 mutate_each
。例如,如果 .
表示列 A
,我认为另一个 data.frame 中名为 A
的列可能是 dplyr
可能喜欢的列。因此,我为 factors
创建了一个数据框,然后使用 mutate_each
。看来结局是对的。由于我没有技术背景,恐怕我无法真正提供任何解释。希望大家不要介意。
factors <- data.frame(A = 1, B = 1.2, C = 0.8, D = 0.75)
mutate_at(data, vars(A:D), funs(. / foo$.))
# By the time I answered this question, the following was working.
# But mutate_each() is now deprecated.
# mutate_each(data, funs(. / factors$.), A:D)
# ID Type A B C D
#1 1 X 3 0.8333333 3.75 5.333333
#2 2 X 174 106.6666667 82.50 76.000000
#3 3 X 6 1.6666667 2.50 5.333333
#4 4 Y 1377 849.1666667 312.50 334.666667
#5 5 Y 537 353.3333333 161.25 165.333333
#6 6 Y 173 115.8333333 50.00 50.666667
编辑
这也行。鉴于数据框是列表的特例,这也许不足为奇。
# Experiment
foo <- list(A = 1, B = 1.2, C = 0.8, D = 0.75)
mutate_at(data, vars(A:D), funs(. / foo$.))
# mutate_each(data, funs(. / foo$.), A:D)
# ID Type A B C D
#1 1 X 3 0.8333333 3.75 5.333333
#2 2 X 174 106.6666667 82.50 76.000000
#3 3 X 6 1.6666667 2.50 5.333333
#4 4 Y 1377 849.1666667 312.50 334.666667
#5 5 Y 537 353.3333333 161.25 165.333333
#6 6 Y 173 115.8333333 50.00 50.666667
从 dplyr 1.0.0
开始,您可以:
data %>%
rowwise() %>%
mutate(across(A:D)/factors)
ID Type A B C D
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 X 3 0.833 3.75 5.33
2 2 X 174 107. 82.5 76
3 3 X 6 1.67 2.5 5.33
4 4 Y 1377 849. 312. 335.
5 5 Y 537 353. 161. 165.
6 6 Y 173 116. 50 50.7
对我的数据类型来说,一个非常常见的操作是对所有列应用归一化因子。这可以使用 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
,而不是将每列除以其匹配因子。
在 akrun 的鼓励下,让我 post 在这里回答我所做的事情。我只是直觉地认为您可能希望 R 指示具有相同名称的列来执行此操作 mutate_each
。例如,如果 .
表示列 A
,我认为另一个 data.frame 中名为 A
的列可能是 dplyr
可能喜欢的列。因此,我为 factors
创建了一个数据框,然后使用 mutate_each
。看来结局是对的。由于我没有技术背景,恐怕我无法真正提供任何解释。希望大家不要介意。
factors <- data.frame(A = 1, B = 1.2, C = 0.8, D = 0.75)
mutate_at(data, vars(A:D), funs(. / foo$.))
# By the time I answered this question, the following was working.
# But mutate_each() is now deprecated.
# mutate_each(data, funs(. / factors$.), A:D)
# ID Type A B C D
#1 1 X 3 0.8333333 3.75 5.333333
#2 2 X 174 106.6666667 82.50 76.000000
#3 3 X 6 1.6666667 2.50 5.333333
#4 4 Y 1377 849.1666667 312.50 334.666667
#5 5 Y 537 353.3333333 161.25 165.333333
#6 6 Y 173 115.8333333 50.00 50.666667
编辑
这也行。鉴于数据框是列表的特例,这也许不足为奇。
# Experiment
foo <- list(A = 1, B = 1.2, C = 0.8, D = 0.75)
mutate_at(data, vars(A:D), funs(. / foo$.))
# mutate_each(data, funs(. / foo$.), A:D)
# ID Type A B C D
#1 1 X 3 0.8333333 3.75 5.333333
#2 2 X 174 106.6666667 82.50 76.000000
#3 3 X 6 1.6666667 2.50 5.333333
#4 4 Y 1377 849.1666667 312.50 334.666667
#5 5 Y 537 353.3333333 161.25 165.333333
#6 6 Y 173 115.8333333 50.00 50.666667
从 dplyr 1.0.0
开始,您可以:
data %>%
rowwise() %>%
mutate(across(A:D)/factors)
ID Type A B C D
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 1 X 3 0.833 3.75 5.33
2 2 X 174 107. 82.5 76
3 3 X 6 1.67 2.5 5.33
4 4 Y 1377 849. 312. 335.
5 5 Y 537 353. 161. 165.
6 6 Y 173 116. 50 50.7