在没有复杂解释的情况下,让我们创建一个小的示例数据框架:

A <- c(1,2,3,4)
B <- c(3,4,5,7)
C <- c(3,4,7,3)
D <- c(8,3,2,4)
df <- data.frame(A,B,C,D)

> df
  A B C D
1 1 3 3 8
2 2 4 4 3
3 3 5 7 2
4 4 7 3 4

我想使用apply函数计算A,B和C列中的百分比值。基于每行最大值的百分比值,换句话说:
%_to_be_calculated <- df[i,j] * 100 / max(df[i,1:3])

其中j A,B列的C索引; i表中的后续行。

所需的输出:
  A     B       C       D
1 33.33 100     100     8
2 50    100     100     3
3 42.85 71.42   100     2
4 57.14 100     42.85   4

我的解决方案:
apply(df,1,function(i) lapply(i[1:3],function(j) j*100/max(i[1:3])))

它可以工作,但是它返回列表列表...我想拥有一个不错的df,您能给我一个提示如何替换当前df中的值吗?

谢谢。

最佳答案

有多种方法可以做到这一点。

普通的apply方式:

df[1:3] <- t(apply(df[1:3], 1, function(x) x/max(x) * 100))
df

#         A         B         C D
#1 33.33333 100.00000 100.00000 8
#2 50.00000 100.00000 100.00000 3
#3 42.85714  71.42857 100.00000 2
#4 57.14286 100.00000  42.85714 4

也可以通过以下方式完成:
df[1:3] <- df[1:3] * 100/apply(df[1:3], 1, max)

一种更快的方法是使用do.callpmax
df[1:3] <- df[1:3] * 100 /do.call(pmax, df[1:3])

08-25 02:56