R中行内的操作

xjreopfe  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(96)

考虑以下数据集,其中:

  • 变量1-7(var1-7)是取自五只蜥蜴(indvA-E)的线性测量值;
  • 变量8(var8)是对于每只蜥蜴包含不等于NA的值的变量的数目;
  • 变量9(var9)是变量1-7的和;
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)
    
data
    
#        var1 var2 var3 var4 var5 var6 var7 var8 var9
# indv.A 0.13 0.17 0.19   NA   NA   NA   NA    3 0.49
# indv.B 0.08 0.09 0.11 0.11   NA   NA   NA    4 0.39
# indv.C 0.05 0.07 0.19 0.31 0.39 0.40 0.45    7 1.86
# indv.D 0.11 0.15 0.17 0.38 0.41 0.75 0.79    7 2.76
# indv.E 0.09 0.13 0.14 0.17 0.19   NA   NA    5 0.72

我想创建一个名为var10的新变量,它可以描述为“* var 8除以(var 7减去变量1-7中最后一个非NA值)”或“ var 8除以变量1-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

我只是不知道如何在R中写出公式来得到这个变量。任何帮助将不胜感激。

oxf4rvwz

oxf4rvwz1#

**1)**如果需要var1到var7的最后一个非NA值,可以执行以下操作

v1 <- data[cbind(seq_len(nrow(data)), max.col(!is.na(data[1:7]), "last"))]
data$var10 <- data$var8/v1

**2)**对于第二个病例,跳过最后一个非NA

data$var10 <- data$var8/
   apply(data[1:7], 1, \(x) sum(head(x[!is.na(x)], -1)))
> data$var10
[1] 10.000000 14.285714  4.964539  3.553299  9.433962

相关问题