【问题标题】:apply output vector from function to original dataframe将函数的输出向量应用于原始数据帧
【发布时间】:2020-09-28 19:17:22
【问题描述】:

我有(几行)下面的数据框:

dput(DATA)
structure(list(S = c(12, 12, 12, 15, 15, 9), UG = c(100, 124, 
84, 108, 124, 108), N_b = c(5, 5, 5, 5, 5, 5), A = c(-12, -12, 
-12, -15, -15, -9), x.sqr = c(1440, 1440, 1440, 2250, 2250, 810
), e_1 = c(21.8, 21.8, 21.8, 29, 29, 14.6), e_2 = c(9.8, 9.8, 
9.8, 17, 17, 2.6), e_3 = c(-2.2, -2.2, -2.2, 5, 5, -9.4), e_4 = c(-14.2, 
-14.2, -14.2, -7, -7, 0), e_5 = c(0, 0, 0, -19, -19, 0), Lanes = c(3, 
3, 3, 3, 3, 3), m = c(0.85, 0.85, 0.85, 0.85, 0.85, 0.85), 
stiff.girder = c(1468.26598316295, 1839.67918718373, 
1243.17197319875, 1828.80171434252, 2067.33917075424, 1417.62382417312) 
stiff.deck = c(911061.349082292, 2001537.86958229, 477657.265415625, 
630455.156416, 1035790.97653333, 2846237.15553796)), row.names = c(1L, 
40L, 50L, 80L, 100L, 150L), class = "data.frame")

我想写一个计算函数:

R2 <- function(x) { 
  N_b <- x["N_b"]
  N_l <- x["Lanes"]
  A <- x["A"]
  x.sqr <- x["x.sqr"]
  m <- x["m"]
  stiff.girder <-x["stiff.girder"]
  stiff.beam <- x["stiff.deck"]
  e <- x[grepl("e_\\d",names(x))]  
  f <- m * ((N_l/N_b) + (max(A * combn(e,N_l,sum)) / x.sqr) * 
                        ((252*stiff.girder/stiff.beam)^1.304))
  c(val = max(f))
}

但是当我尝试将其应用于数据框时,它会创建多个列,而不是我试图要求的列。

DATA <- cbind(DATA, vars = t(apply(DATA, 1, R2)))

【问题讨论】:

  • 去掉转置t()应该没问题
  • 太棒了!你能给我解释一下为什么吗? @DanY
  • 向量在 R 中被视为列向量。即使当您将它们打印到屏幕上时,它们看起来也像行向量(这只是为了在打印时节省空间)。因此,当您转置列向量时,您会得到一个行向量,并且您正在将一个行向量添加到您的 data.frame - 因此额外的列。
  • 另外tapplyt(apply(...))相同。

标签: r function dataframe apply


【解决方案1】:

正如@DanY 在评论中指出的那样:

DATA <- cbind(DATA, vars = apply(DATA, 1, R2))

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多