【发布时间】:2019-01-16 09:55:13
【问题描述】:
例如,我有兴趣将data.frame 或tibble 的(几乎)所有列替换为从每行中减去行最小值的列。例如,如果X 是一个数值矩阵,那么在底数 R 中我会写:
X = sweep(X, 1, apply(X, 1, min))
我当前使用我拥有的数据执行此操作的函数-我将立即解释格式-将数字列拉出到矩阵中,进行扫描,然后cbinds 转换后的数据和非数值数据重新组合在一起。那就是:
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 列包含每个观察值的数值测量值(如果你关心的话,它们是光谱)。数值变量的数量使得单个mutates 不是前进的方向。同样 - 您仍然需要知道行的最小值才能对每一行进行标准化。
我被要求添加一些数据。原始数据有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
【问题讨论】:
-
只是一个想法,但是否有可能因为数据格式错误而导致数据操作很尴尬? data.frames 并不适合“水平”操作,尽管有一些矢量化函数(如
pmin)可以在您的情况下使用。这取决于您的上下文,但您最好将 1129 列放在一个矩阵中,其中行名作为当前 nm,旁边有一个 4 列元数据 data.frame/tibble。在矩阵上,您可以使用sweep、apply和margin=1等,因为这是矩阵的用途。