如何在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
相关产品推荐
相关产品推荐

