R语言中apply函数引用列索引实现行差计算的问题
解决R中数据框行与对应列行的差值计算问题
嘿,我来帮你搞定这个需求!你想要让df里的a、b行每个单元格减去对应列的c行值,其实不用绕弯子用apply,R的向量化操作就能轻松解决,而且比循环类操作高效得多。
先看你的原始数据:
a <- c(4,5,3,5,1) b <- c(8,9,7,3,5) c <- c(6,7,5,4,3) df <- data.frame(rbind(a,b,c))
最简单的解决方案:向量化减法
因为R会自动把单行向量广播到多行,直接用行索引做减法就行:
# 取前两行(a、b行),每行减去第三行(c行)的对应列值 df2 <- df[1:2, ] - df[3, ] # 转换为数据框并保留行名 df2 <- as.data.frame(df2)
更灵活的按行名取值版本
如果你不确定c行是第3行,而是想通过行名精准获取,可以这么写:
# 按行名提取c行 c_row <- df["c", ] # 提取a、b行并减去c行对应列的值 df2 <- df[c("a", "b"), ] - c_row df2 <- as.data.frame(df2)
为什么你的apply代码行不通?
你尝试的apply(df,c(1,2),function(x) x - df[nrow(df),the col index of x])有两个问题:
- 当
apply的第二个参数是c(1,2)时,是逐个处理每个单元格,这时候无法直接获取当前单元格的列索引; - 这种逐元素处理的方式完全没必要,R的向量化操作已经帮你完成了广播匹配,代码更简洁高效。
验证结果
运行上面的代码后,df2就是你期望的结果:
> df2 X1 X2 X3 X4 X5 a -2 -2 -2 1 -2 b 2 2 2 -1 2
内容的提问来源于stack exchange,提问作者orangeman51
相关产品推荐
相关产品推荐

