gpt4 book ai didi

r - 按向量、按行而不是按列划分数据框

转载 作者:行者123 更新时间:2023-12-04 09:32:54 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to divide each row of a matrix by elements of a vector in R

(3 个回答)


2年前关闭。




我有这个数据框和向量,我想用它来划分行:

div <- c(10,100,1000)
df <- as.data.frame(matrix(rep(1,9),nrow=3))
df <- cbind(type = as.factor(c("A","B","C")),df)
> df
type V1 V2 V3
1 A 1 1 1
2 B 1 1 1
3 C 1 1 1

我想要数据框形式的答案,因素保持原样。
当它与向量相除时,我得到了“错误”的答案:
df1 <- cbind(df[,1], df[,-1]/div)
> df1
df[, 1] V1 V2 V3
1 A 0.100 0.100 0.100
2 B 0.010 0.010 0.010
3 C 0.001 0.001 0.001

我希望每一行除以向量,而不是每一列。

我的解决方法是这样的:
divfun <- function(x){
x / div
}

df2 <- cbind(df[,1], t(apply(df[,-1], 1, divfun)))
> df2
V1 V2 V3
[1,] 1 0.1 0.01 0.001
[2,] 2 0.1 0.01 0.001
[3,] 3 0.1 0.01 0.001

请注意,因子现在丢失了。

所以这里有两个问题:
  • 有没有更简单的方法来做到这一点,而无需为其创建新功能?
  • 假设没有更简单的方法,我的因素 A、B 和 C 发生了什么变化?我猜它与强制矩阵有关(因为 t() )?
  • 最佳答案

    您要找的函数是sweep() :

    sweep(df[, -1], MARGIN = 2, div, FUN = "/")

    > sweep(df[, -1], MARGIN = 2, div, FUN = "/")
    V1 V2 V3
    1 0.1 0.01 0.001
    2 0.1 0.01 0.001
    3 0.1 0.01 0.001

    因此
    cbind(type = df[,1], sweep(df[, -1], 2, div, FUN = "/"))

    > cbind(type = df[,1], sweep(df[, -1], 2, div, FUN = "/"))
    type V1 V2 V3
    1 A 0.1 0.01 0.001
    2 B 0.1 0.01 0.001
    3 C 0.1 0.01 0.001

    为您提供所需的输出。

    请注意,这里的参数 MARGIN不像在 1 中那样引用行( 2 )或列( apply() ) .在 sweep()它指的是对应于 STATS 的数组的边距,您希望清除的向量(在这种情况下是除以)。换句话说, STATS 的第一个元素( div 在您的情况下)是从第 1 列中清除的值,即 STATS 的第二个元素是要扫出第 2 列的值,依此类推。

    关于r - 按向量、按行而不是按列划分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25551274/

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