1

我有一个数据框

   A  B  C  D
r1 10  7 19 11
r2  5  5  7  8
r3 12  9 13 11
r4  8 10 11  9

我想创建 2 个数据框,其值为:

  1. 从该行的每个元素中减去min该行中的值,
  2. 从该列的每个元素中减去min列中的值。

我得到了专栏的功能

d1=transform(d,A=A-(min(A)),B=B-(min(B)),C=C-(min(C)),D=D-(min(D)))

我得到的结果如下,

> d1
  A B  C D

r1 5 2 12 3

r2 0 0  0 0

r3 7 4  6 3

r4 3 5  4 1

我应该使用什么函数来获取行的结果,我想要的是

> d2
  A B  C D

r1 0 2  9 1

r2 0 5  2 3

r3 1 3  2 0

r4 0 7  3 1

min从行的每个项目中减去行的值)

4

3 回答 3

1

您还可以使用以下apply功能:

# 1 for the rows
apply(d, 1, function(x){x-min(x)}
# 2 for the columns 
apply(d, 2, function(x){x-min(x)}
于 2020-10-12T14:00:39.240 回答
1

如果我理解了您的问题,您可以在数据框的转置上运行“列函数”。转置后的数据框会变成矩阵,因此您需要将其转回数据框:

transpose <- as.data.frame(
  t(yourDataFrame)
)

d2 <- transform(transpose ,A=A-(min(A)),B=B-(min(B)),C=C-(min(C)),D=D-(min(D)))

顺便说一句,这个问题可能更清楚。我建议您阅读如何创建一个最小的、可重现的示例https ://stackoverflow.com/help/minimal-reproducible-example

于 2020-10-12T11:12:30.483 回答
0

我们可以用pmin

d - do.call(pmin, d)

或按列

library(matrixStats)
d - colMins(as.matrix(d))[col(d)]
于 2020-10-12T23:30:42.633 回答