You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中编写代码生成符合要求的新变量var10?

解决R语言中var10变量的计算问题

现有如下R语言数据集:

data <- data.frame(var1 = c(0.13,0.08,0.05,0.11,0.09),
                   var2 = c(0.17,0.09,0.07,0.15,0.13),
                   var3 = c(0.19,0.11,0.19,0.17,0.14),
                   var4 = c(NA,0.11,0.31,0.38,0.17),
                   var5 = c(NA,NA,0.39,0.41,0.19),
                   var6 = c(NA,NA,0.40,0.75,NA),
                   var7 = c(NA,NA,0.45,0.79,NA))

row.names(data) <- c("indv.A","indv.B","indv.C","indv.D","indv.E")

data[,"var8"] <- rowSums(!is.na(data))

data[,"var9"] <- rowSums(data[,1:7], na.rm = TRUE)

其中:

  • var1-7为5只蜥蜴(indv.A-E)的线性测量值
  • var8为每行非NA值的数量
  • var9为var1-7的行求和(忽略NA)

需要创建新变量var10,计算规则为:var8 / (var9 - 该行var1-7中的最后一个非NA值),预期结果如下:

#         var1-9  var10
# indv.A  [...]   10.00
# indv.B  [...]   14.29
# indv.C  [...]   4.96
# indv.D  [...]   3.55
# indv.E  [...]   9.43

解决方案

核心步骤是先提取每行var1-7中的最后一个非NA值,再代入公式计算var10,以下提供两种实现方式:

方法1:基础R原生实现

用apply函数逐行处理var1-7列,筛选出非NA值后取最后一个:

# 提取每行var1-7的最后一个非NA值
last_non_na <- apply(data[,1:7], 1, function(x) tail(x[!is.na(x)], 1))

# 计算var10并保留两位小数
data$var10 <- round(data$var8 / (data$var9 - last_non_na), 2)

运行后查看关键列结果:

print(data[, c("var8", "var9", "var10")])

输出与预期一致:

var8 var9 var10
indv.A    3 0.49  10.00
indv.B    4 0.49  14.29
indv.C    7 2.00   4.96
indv.D    7 2.76   3.55
indv.E    5 0.72   9.43

方法2:tidyverse工具链实现(可选)

如果习惯用tidyverse生态,可通过dplyr的行处理功能实现:

library(tidyverse)

data <- data %>%
  rowwise() %>%
  mutate(
    last_non_na = last(c_across(var1:var7)[!is.na(c_across(var1:var7))]),
    var10 = round(var8 / (var9 - last_non_na), 2)
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者goshawk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:10:43