在没有复杂解释的情况下,让我们创建一个小的示例数据框架:
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.call
和pmax
df[1:3] <- df[1:3] * 100 /do.call(pmax, df[1:3])