gpt4 book ai didi

r - 如何使用 dplyr 扫描特定列?

转载 作者:行者123 更新时间:2023-12-04 01:02:22 25 4
gpt4 key购买 nike

对于我的数据类型,一个非常常见的操作是对所有列应用归一化因子。这可以使用 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 , 而不是每一列的匹配因子。

最佳答案

鉴于 akrun 的鼓励,让我在这里发布我所做的作为答案。我只是直觉地认为你可能想要让 R 指示具有相同名称的列来执行此操作 mutate_each .例如,如果 .表示列,A ,我想到另一列名为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

关于r - 如何使用 dplyr 扫描特定列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28298688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com