gpt4 book ai didi

r - 使用 dplyr/tidyverse 进行类似扫描的操作

转载 作者:行者123 更新时间:2023-12-04 11:42:42 27 4
gpt4 key购买 nike

例如,我感兴趣的是替换(几乎)data.frame 的所有列。或 tibble列中的行最小值已从每行中减去。例如,如果 X是一个数值矩阵,那么在基数 R 中我会写:

X = sweep(X, 1, apply(X, 1, min))

我当前使用我拥有的数据执行此操作的功能 - 我将暂时解释格式 - 将数字列提取到矩阵中,进行扫描,然后 cbind s 转换后的数据和非数值数据重新组合在一起。那是:
subtractMin = function(data){
X = data %>%
select(starts_with("X")) %>%
as.matrix()

X = sweep(X, 1, apply(X, 1, min))

labels = data %>%
select(-starts_with("X"))

return(cbind(labels, X))
}

这让我觉得效率低下,还有 必须成为更聪明的方式。

我认为了解上下文并不重要,但我的数据有 77 行和 1133 列。其中四列包含标签信息,其余 1129 列包含每个观察的数值测量值(如果您关心,它们是光谱)。数值变量的数量使得个体 mutate s 不是前进的道路。同样 - 您仍然需要知道行的最小值以对每一行进行标准化。

我被要求添加一些数据。原始数据有1000多列,所以我会提供一个更小的数据集
> x.df
nm X1799.38928 X1798.01526 X1796.64124 source color rep
1 s001c1 13901.944 13889.056 13883.334 01 c 1
2 s001c2 17293.586 17279.375 17291.365 01 c 2
3 s001c3 8011.764 8028.584 8033.548 01 c 3
4 s001c4 7499.272 7510.719 7517.064 01 c 4
5 s001c5 20300.408 20293.604 20297.185 01 c 5

最佳答案

(对于它的值(value),我认为这里的反对票有点苛刻和毫无根据。问题陈述很清楚,并且示例数据已包含在编辑中。)

您可以通过将数字列中的数据从宽转换为长(使用 gather )、按行分组(使用 group_by )、减去最小值(使用 mutate )并从长转换回来来实现您所追求的到宽(使用 spread )。

library(tidyverse)
df %>%
gather(k, v, starts_with("X")) %>%
group_by(nm) %>%
mutate(v = v - min(v)) %>%
spread(k, v) %>%
select(names(df))
## A tibble: 5 x 7
## Groups: nm [5]
# nm X1799.38928 X1798.01526 X1796.64124 source color rep
# <fct> <dbl> <dbl> <dbl> <int> <fct> <int>
#1 s001c1 18.6 5.72 0. 1 c 1
#2 s001c2 14.2 0. 12.0 1 c 2
#3 s001c3 0. 16.8 21.8 1 c 3
#4 s001c4 0. 11.4 17.8 1 c 4
#5 s001c5 6.80 0. 3.58 1 c 5

样本数据
df <- read.table(text =
"nm X1799.38928 X1798.01526 X1796.64124 source color rep
1 s001c1 13901.944 13889.056 13883.334 01 c 1
2 s001c2 17293.586 17279.375 17291.365 01 c 2
3 s001c3 8011.764 8028.584 8033.548 01 c 3
4 s001c4 7499.272 7510.719 7517.064 01 c 4
5 s001c5 20300.408 20293.604 20297.185 01 c 5")

关于r - 使用 dplyr/tidyverse 进行类似扫描的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51758452/

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